คำถามติดแท็ก c

C เป็นภาษาโปรแกรมทั่วไปที่ใช้สำหรับการเขียนโปรแกรมระบบ (ระบบปฏิบัติการและฝังตัว), ห้องสมุด, เกมและข้ามแพลตฟอร์ม แท็กนี้ควรใช้กับคำถามทั่วไปที่เกี่ยวข้องกับภาษา C ตามที่กำหนดไว้ในมาตรฐาน ISO 9899 (เวอร์ชันล่าสุด 9899: 2018 เว้นแต่ระบุไว้เป็นอย่างอื่น - นอกจากนี้ยังติดแท็กคำขอเฉพาะรุ่นด้วย c89, c99, c11 ฯลฯ ) C แตกต่างจาก C ++ และไม่ควรใช้ร่วมกับแท็ก C ++ หากไม่มีเหตุผล

11
คุณอนุญาตให้เว้นวรรคโดยใช้ scanf ได้อย่างไร
ใช้รหัสต่อไปนี้: char *name = malloc(sizeof(char) + 256); printf("What is your name? "); scanf("%s", name); printf("Hello %s. Nice to meet you.\n", name); ผู้ใช้สามารถใส่ชื่อของพวกเขา แต่เมื่อพวกเขาใส่ชื่อที่มีพื้นที่เหมือนLucas Aardvark, เพียงแค่ตัดทุกอย่างหลังจากscanf() Lucasฉันจะscanf()อนุญาตช่องว่างได้อย่างไร
129 c  string  printf  scanf  whitespace 

4
ทำไม sizeof (my_arr) [0] จึงคอมไพล์และเท่ากับ sizeof (my_arr [0])
ทำไมโค้ดนี้จึงคอมไพล์ _Static uint32_t my_arr[2]; _Static_assert(sizeof(my_arr) == 8, ""); _Static_assert(sizeof(my_arr[0]) == 4, ""); _Static_assert(sizeof(my_arr)[0] == 4, ""); การยืนยัน 2 รายการแรกนั้นถูกต้อง แต่ฉันคาดว่าบรรทัดสุดท้ายจะล้มเหลวเนื่องจากความเข้าใจของฉันคือsizeof()ควรประเมินเป็นลิเทอรัลจำนวนเต็มซึ่งไม่สามารถถือเป็นอาร์เรย์ได้ กล่าวอีกนัยหนึ่งมันจะล้มเหลวในลักษณะเดียวกับที่บรรทัดต่อไปนี้ล้มเหลว: _Static_assert(4[0] == 4, ""); ที่น่าสนใจสิ่งต่อไปนี้ไม่สามารถรวบรวมได้อย่างแท้จริง (ซึ่งควรทำในสิ่งเดียวกันไม่ใช่หรือ): _Static_assert(*sizeof(my_arr) == 4, ""); ข้อผิดพลาด: อาร์กิวเมนต์ประเภทที่ไม่ถูกต้องของ unary '*' (have 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, ""); ถ้าเป็นเรื่องสำคัญฉันใช้ gcc 5.3.0
129 c  sizeof 

11
รับ GDB เพื่อบันทึกรายการเบรกพอยต์
ตกลงการแบ่งข้อมูลจะแสดงรายการเบรกพอยต์ แต่ไม่ใช่ในรูปแบบที่ใช้ได้ดีกับการนำกลับมาใช้ใหม่โดยใช้ - คำสั่งเหมือนในคำถามนี้ GDB มีวิธีการทิ้งลงในไฟล์ที่ยอมรับสำหรับการป้อนข้อมูลอีกครั้งหรือไม่ บางครั้งในเซสชันการดีบักจำเป็นต้องรีสตาร์ท GDB หลังจากสร้างชุดเบรกพอยต์สำหรับการทดสอบ ไฟล์. gdbinit มีปัญหาเหมือนกับ --command ข้อมูลแบ่งคำสั่งไม่ได้แสดงรายการคำสั่ง แต่เป็นโต๊ะสำหรับมนุษย์บริโภค ในการอธิบายอย่างละเอียดนี่คือตัวอย่างจากตัวแบ่งข้อมูล : (gdb) ตัวแบ่งข้อมูล Num Type Disp Enb Address คืออะไร 1 เบรกพอยต์ให้ y 0x08048517 <foo :: bar (โมฆะ) +7>
129 c++  c  debugging  gdb  breakpoints 

7
UTF-8 แบบปกติคืออะไร?
โครงการไอซียู (ซึ่งตอนนี้ยังมีห้องสมุด PHP ) มีการเรียนที่จำเป็นในการช่วยเหลือปกติ UTF-8 สตริงเพื่อให้ง่ายในการเปรียบเทียบค่าเมื่อการค้นหา อย่างไรก็ตามฉันกำลังพยายามหาว่านี่หมายถึงอะไรสำหรับแอปพลิเคชัน ตัวอย่างเช่นในกรณีใดที่ฉันต้องการ "ความเท่าเทียมกันของมาตรฐาน" แทน "ความเท่าเทียมกันของความเข้ากันได้" หรือในทางกลับกัน

9
คอมไพเลอร์จะเริ่มต้นหน่วยความจำเป็น 0xCD, 0xDD และอื่น ๆ บน malloc / free / new / delete เมื่อใดและทำไม
ฉันรู้ว่าบางครั้งคอมไพเลอร์จะเริ่มต้นหน่วยความจำด้วยรูปแบบบางอย่างเช่น0xCDและ0xDD. สิ่งที่ฉันอยากรู้คือจะเกิดขึ้นเมื่อไหร่และทำไม เมื่อไหร่ สิ่งนี้เฉพาะสำหรับคอมไพเลอร์ที่ใช้หรือไม่? ทำmalloc/newและfree/deleteทำงานในลักษณะเดียวกันในเรื่องนี้หรือไม่? เป็นแพลตฟอร์มเฉพาะหรือไม่? มันจะเกิดขึ้นบนระบบปฏิบัติการอื่นเช่นLinuxหรือVxWorks? ทำไม ความเข้าใจของฉันคือสิ่งนี้เกิดขึ้นเฉพาะในWin32การกำหนดค่าการดีบักและใช้เพื่อตรวจจับการใช้หน่วยความจำมากเกินไปและเพื่อช่วยคอมไพลเลอร์ตรวจจับข้อยกเว้น คุณช่วยยกตัวอย่างที่ใช้ได้จริงว่าการเริ่มต้นนี้มีประโยชน์อย่างไร ฉันจำได้ว่าอ่านบางอย่าง (อาจอยู่ใน Code Complete 2) โดยบอกว่าเป็นการดีที่จะเริ่มต้นหน่วยความจำเป็นรูปแบบที่รู้จักเมื่อจัดสรรและรูปแบบบางอย่างจะทริกเกอร์การขัดจังหวะWin32ซึ่งจะส่งผลให้มีข้อยกเว้นที่แสดงในดีบักเกอร์ พกพาสะดวกขนาดนี้?

3
เอาต์พุตโปรแกรมด้านล่าง 'C89' เมื่อรวบรวมในโหมด C89 และ `C99` เมื่อรวบรวมในโหมด C99 อย่างไร
ฉันพบโปรแกรม C นี้จากเว็บ: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } สิ่งที่น่าสนใจของโปรแกรมนี้คือเมื่อคอมไพล์และรันในโหมด C89 มันจะพิมพ์C89และเมื่อคอมไพล์และรันในโหมด C99 มันจะพิมพ์C99ออกมา แต่ฉันไม่สามารถคิดออกว่าโปรแกรมนี้ทำงานอย่างไร คุณช่วยอธิบายว่าอาร์กิวเมนต์ที่สองของprintfงานในโปรแกรมข้างต้นได้อย่างไร
128 c  printf  comments  c99  c89 

12
เป็นไปได้หรือไม่ที่จะรวบรวม Python เป็นรหัสเครื่อง
เป็นไปได้แค่ไหนที่จะรวบรวม Python (อาจผ่านการแทนค่า C ระดับกลาง) ลงในรหัสเครื่อง สันนิษฐานว่าจำเป็นต้องเชื่อมโยงไปยังไลบรารีรันไทม์ของ Python และส่วนใด ๆ ของไลบรารีมาตรฐาน Python ซึ่งเป็น Python เองก็จำเป็นต้องคอมไพล์ (และเชื่อมโยง) ด้วย นอกจากนี้คุณจะต้องรวมตัวแปล Python หากคุณต้องการทำการประเมินนิพจน์แบบไดนามิก แต่อาจเป็นชุดย่อยของ Python ที่ไม่อนุญาตให้ทำสิ่งนี้ก็ยังมีประโยชน์ จะให้ข้อได้เปรียบด้านความเร็วและ / หรือการใช้งานหน่วยความจำหรือไม่? สันนิษฐานว่าเวลาเริ่มต้นของตัวแปล Python จะถูกตัดออก (แม้ว่าไลบรารีที่ใช้ร่วมกันจะยังคงต้องโหลดเมื่อเริ่มต้น)
128 python  c  linker  compilation 

30
จะแปลงตัวแปรประเภท enum เป็นสตริงได้อย่างไร?
จะทำให้ printf แสดงค่าของตัวแปรที่เป็น enum ได้อย่างไร? ตัวอย่างเช่น: typedef enum {Linux, Apple, Windows} OS_type; OS_type myOS = Linux; และสิ่งที่ฉันต้องการก็คือ printenum(OS_type, "My OS is %s", myOS); ซึ่งต้องแสดงสตริง "Linux" ไม่ใช่จำนวนเต็ม ฉันคิดว่าก่อนอื่นฉันต้องสร้างอาร์เรย์ของสตริงที่มีดัชนีค่า แต่ฉันไม่รู้ว่านั่นเป็นวิธีที่สวยงามที่สุดที่จะทำหรือไม่ เป็นไปได้หรือไม่
128 c++  c  preprocessor  ansi-c 

10
นิพจน์ตัวชี้: * ptr ++, * ++ ptr และ ++ * ptr
เมื่อเร็ว ๆ นี้ฉันพบปัญหานี้ซึ่งฉันไม่สามารถเข้าใจได้ด้วยตัวเอง ทำอะไรที่สามเหล่านี้แสดงออกจริงๆหมายถึง? *ptr++ *++ptr ++*ptr ฉันได้ลอง Ritchie แล้ว แต่น่าเสียดายที่ไม่สามารถทำตามสิ่งที่เขาบอกเกี่ยวกับปฏิบัติการทั้ง 3 นี้ได้ ฉันรู้ว่าพวกเขาทั้งหมดทำเพื่อเพิ่มตัวชี้ / ค่าที่ชี้ไป ฉันยังเดาได้ว่าอาจมีหลายสิ่งหลายอย่างเกี่ยวกับลำดับความสำคัญและลำดับของการประเมินผล เช่นเดียวกับการเพิ่มตัวชี้หนึ่งครั้งก่อนจากนั้นดึงเนื้อหาของตัวชี้นั้นตัวหนึ่งก็ดึงเนื้อหาจากนั้นจึงเพิ่มตัวชี้เป็นต้นอย่างที่คุณเห็นฉันไม่มีความเข้าใจที่ชัดเจนเกี่ยวกับการทำงานจริงของตัวชี้ซึ่งฉันต้องการ ชัดเจนโดยเร็วที่สุด แต่ฉันหลงทางอย่างแท้จริงเมื่อมีโอกาสสมัครเข้าโปรแกรม ตัวอย่างเช่น: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } ให้ผลลัพธ์นี้แก่ฉัน: ello แต่ความคาดหวังของฉันคือมันจะพิมพ์ออกHelloมา คำขอสุดท้าย - โปรดยกตัวอย่างการทำงานของแต่ละนิพจน์ในข้อมูลโค้ดที่กำหนด ส่วนใหญ่แล้วมีเพียงย่อหน้าของทฤษฎีเท่านั้นที่ลอยอยู่เหนือหัวของฉัน
128 c++  c  pointers  increment 

7
จะเกิดอะไรขึ้นถ้าฉันกำหนดอาร์เรย์ขนาด 0 ใน C / C ++
แค่อยากรู้ว่าจะเกิดอะไรขึ้นถ้าฉันกำหนดอาร์เรย์ที่มีความยาวเป็นศูนย์int array[0];ในโค้ด? GCC ไม่บ่นเลย โปรแกรมตัวอย่าง #include <stdio.h> int main() { int arr[0]; return 0; } การอธิบาย ฉันกำลังพยายามหาว่าอาร์เรย์ที่มีความยาวเป็นศูนย์เริ่มต้นด้วยวิธีนี้แทนที่จะชี้ไปที่ความยาวตัวแปรในความคิดเห็นของ Darhazer นั้นได้รับการปรับให้เหมาะสมหรือไม่ นี่เป็นเพราะฉันต้องปล่อยโค้ดบางส่วนออกไปในป่าดังนั้นฉันจึงพยายามคิดว่าฉันต้องจัดการกับกรณีที่SIZEถูกกำหนดไว้0หรือไม่ซึ่งเกิดขึ้นในบางรหัสที่มีการกำหนดแบบคงที่int array[SIZE]; ฉันรู้สึกประหลาดใจจริงๆที่ GCC ไม่บ่นซึ่งนำไปสู่คำถามของฉัน จากคำตอบที่ฉันได้รับฉันเชื่อว่าการไม่มีคำเตือนส่วนใหญ่เกิดจากการรองรับโค้ดเก่าซึ่งไม่ได้รับการอัปเดตด้วยไวยากรณ์ [] ใหม่ เนื่องจากฉันสงสัยเกี่ยวกับข้อผิดพลาดเป็นหลักฉันจึงติดแท็กคำตอบของ Lundin ว่าถูกต้อง (ของ Nawaz เป็นครั้งแรก แต่ยังไม่สมบูรณ์เท่าที่ควร) คนอื่น ๆ ชี้ให้เห็นถึงการใช้งานจริงสำหรับโครงสร้างเบาะท้ายในขณะที่เกี่ยวข้องนั้นไม่ได้ สิ่งที่ฉันกำลังมองหา
127 c++  c  arrays 

3
การโทรแบบขนานเพื่อส่ง / รับสัญญาณบนซ็อกเก็ตเดียวกันถูกต้องหรือไม่
เราสามารถเรียกส่งจากเธรดหนึ่งและรับจากอีกเธรดหนึ่งบนซ็อกเก็ตเดียวกันได้หรือไม่? เราสามารถเรียกการส่งหลายรายการแบบคู่ขนานจากเธรดที่แตกต่างกันบนซ็อกเก็ตเดียวกันได้หรือไม่ ฉันรู้ว่าการออกแบบที่ดีควรหลีกเลี่ยงสิ่งนี้ แต่ฉันไม่ชัดเจนว่า API ของระบบเหล่านี้จะทำงานอย่างไร ฉันไม่พบเอกสารที่ดีสำหรับเรื่องเดียวกันนี้ ตัวชี้ทิศทางใด ๆ จะเป็นประโยชน์
127 c  networking  sockets 

5
Python (และ Python C API): __new__ เทียบกับ __init__
คำถามที่ฉันกำลังจะถามดูเหมือนจะซ้ำกันกับการใช้ __new__ และ __init__ของPython? แต่อย่างไรก็ตามก็ยังไม่ชัดเจนสำหรับฉันว่าความแตกต่างในทางปฏิบัติระหว่าง__new__และ__init__คืออะไร ก่อนที่คุณจะรีบบอกฉันว่า__new__มีไว้สำหรับสร้างวัตถุและ__init__มีไว้สำหรับการเริ่มต้นอ็อบเจ็กต์ขอฉันพูดให้ชัดเจน: ฉันเข้าใจ ในความเป็นจริงความแตกต่างนั้นค่อนข้างเป็นธรรมชาติสำหรับฉันเนื่องจากฉันมีประสบการณ์ใน C ++ ที่เรามีการจัดวางใหม่ซึ่งแยกการจัดสรรอ็อบเจ็กต์ออกจากการเริ่มต้นในทำนองเดียวกัน หลาม C API กวดวิชาอธิบายเช่นนี้ สมาชิกใหม่มีหน้าที่สร้างอ็อบเจ็กต์ประเภท (ซึ่งตรงข้ามกับการกำหนดค่าเริ่มต้น) มันถูกเปิดเผยใน Python เป็น__new__()วิธีการ ... เหตุผลหนึ่งที่จะใช้วิธีการใหม่เพื่อให้มั่นใจค่าเริ่มต้นของตัวแปรเช่น ใช่แล้ว - ฉันได้อะไร__new__แต่ถึงอย่างนั้นฉันก็ยังไม่เข้าใจว่าทำไมมันถึงมีประโยชน์ใน Python ตัวอย่างที่ระบุบอกว่า__new__อาจมีประโยชน์หากคุณต้องการ "รับรองค่าเริ่มต้นของตัวแปรอินสแตนซ์" ก็ใช่ว่า__init__จะทำอะไร? ในบทช่วยสอน C API ตัวอย่างจะแสดงที่สร้าง Type ใหม่ (เรียกว่า "Noddy") และกำหนด__new__ฟังก์ชันของ Type ประเภท Noddy ประกอบด้วยสมาชิกสตริงที่เรียกว่าfirstและสมาชิกสตริงนี้เริ่มต้นเป็นสตริงว่างดังนี้: static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject …
127 python  c  python-c-api 

8
มีวิธีระบุจำนวนอักขระของสตริงที่จะพิมพ์โดยใช้ printf () หรือไม่?
มีวิธีระบุจำนวนอักขระของสตริงที่จะพิมพ์ออกมา (คล้ายกับตำแหน่งทศนิยมในints) หรือไม่? printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars"); ต้องการให้พิมพ์: Here are the first 8 chars: A string
127 c++  c  printf 

8
จะวัดเวลาเป็นมิลลิวินาทีโดยใช้ ANSI C ได้อย่างไร?
การใช้ ANSI C เพียงอย่างเดียวมีวิธีใดในการวัดเวลาด้วยความแม่นยำระดับมิลลิวินาทีขึ้นไปหรือไม่? ฉันกำลังเรียกดูเวลา h แต่ฉันพบฟังก์ชันความแม่นยำที่สองเท่านั้น

4
การใช้ _start () ใน C คืออะไร?
ฉันเรียนรู้จากเพื่อนร่วมงานว่าสามารถเขียนและรันโปรแกรม C ได้โดยไม่ต้องเขียนmain()ฟังก์ชัน สามารถทำได้ดังนี้: my_main.c /* Compile this with gcc -nostartfiles */ #include <stdlib.h> void _start() { int ret = my_main(); exit(ret); } int my_main() { puts("This is a program without a main() function!"); return 0; } รวบรวมด้วยคำสั่งนี้: gcc -o my_main my_main.c –nostartfiles เรียกใช้ด้วยคำสั่งนี้: ./my_main เมื่อไหร่ที่ต้องทำแบบนี้? มีสถานการณ์จริงในโลกที่จะเป็นประโยชน์หรือไม่?
126 c 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.