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

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

13
เหตุใดขนาดของพารามิเตอร์อาร์เรย์จึงไม่เหมือนกับภายใน main
เหตุใดขนาดของอาร์เรย์ที่ส่งเป็นพารามิเตอร์จึงไม่เหมือนกับภายใน main #include <stdio.h> void PrintSize(int p_someArray[10]); int main () { int myArray[10]; printf("%d\n", sizeof(myArray)); /* As expected, 40 */ PrintSize(myArray);/* Prints 4, not 40 */ } void PrintSize(int p_someArray[10]){ printf("%d\n", sizeof(p_someArray)); }
104 c  arrays  function  sizeof 

16
การล้างอาร์เรย์ถ่าน c
ฉันคิดว่าการตั้งค่าองค์ประกอบแรกเป็น null จะเป็นการล้างเนื้อหาทั้งหมดของอาร์เรย์ถ่าน char my_custom_data[40] = "Hello!"; my_custom_data[0] = '\0'; อย่างไรก็ตามสิ่งนี้จะตั้งค่าองค์ประกอบแรกเป็นโมฆะเท่านั้น หรือ my_custom_data[0] = 0; แทนที่จะใช้memsetฉันคิดว่า 2 ตัวอย่างข้างต้นควรล้างข้อมูลทั้งหมด
104 c  arrays  char 

10
การจัดทำดัชนีเป็นโครงสร้างถูกกฎหมายหรือไม่?
ไม่ว่าโค้ดจะ 'แย่แค่ไหน' และสมมติว่าการจัดตำแหน่ง ฯลฯ ไม่ใช่ปัญหาในคอมไพเลอร์ / แพลตฟอร์มพฤติกรรมที่ไม่ได้กำหนดหรือเสียหรือไม่? ถ้าฉันมีโครงสร้างแบบนี้: - struct data { int a, b, c; }; struct data thing; มันเป็นสิ่งที่ถูกต้องตามกฎหมายในการเข้าถึงa, bและcเป็น(&thing.a)[0], (&thing.a)[1]และ(&thing.a)[2]? ในทุก ๆ คอมไพเลอร์และทุกแพลตฟอร์มที่ฉันลองใช้กับทุกการตั้งค่าที่ฉันลองมัน 'ได้ผล' ฉันแค่กังวลว่าคอมไพเลอร์อาจไม่ทราบว่าbและthing [1]เป็นสิ่งเดียวกันและเก็บค่า 'b' ไว้ในรีจิสเตอร์และสิ่งที่ [1] อ่านค่าผิดจากหน่วยความจำ (เช่น) ในทุกกรณีฉันพยายามทำในสิ่งที่ถูกต้อง (ฉันรู้แน่นอนว่ามันไม่ได้พิสูจน์อะไรมาก) นี่ไม่ใช่รหัสของฉัน มันรหัสฉันต้องทำงานกับฉันสนใจไม่ว่าจะเป็นที่ไม่ดีรหัสหรือเสียรหัสที่แตกต่างกันมีผลต่อการจัดลำดับความสำคัญของฉันสำหรับการเปลี่ยนแปลงการจัดการที่ดี :) ติดแท็ก C และ C ++ ฉันสนใจ C ++ เป็นส่วนใหญ่ แต่ยังรวมถึง C …
104 c++  c  struct 

13
ลองจับข้อความใน C
วันนี้ฉันคิดเกี่ยวกับบล็อก try / catch ที่มีอยู่ในภาษาอื่น Googled ในขณะนี้ แต่ไม่มีผลลัพธ์ จากสิ่งที่ฉันรู้ไม่มีสิ่งที่เหมือนกับ try / catch ใน C อย่างไรก็ตามมีวิธี "จำลอง" หรือไม่? แน่นอนว่ามีการยืนยันและเทคนิคอื่น ๆ แต่ไม่มีอะไรเหมือนกับการลอง / จับที่จับข้อยกเว้นที่เพิ่มขึ้น ขอบคุณ
104 c 

2
ฉันสามารถเรียก memcpy () และ memmove () โดยตั้งค่า "จำนวนไบต์" เป็นศูนย์ได้หรือไม่
ฉันจำเป็นต้องปฏิบัติต่อกรณีหรือไม่เมื่อฉันไม่มีสิ่งใดให้เคลื่อนย้าย / คัดลอกโดยมีmemmove()/ memcpy()เป็นกรณีขอบ int numberOfBytes = ... if( numberOfBytes != 0 ) { memmove( dest, source, numberOfBytes ); } หรือฉันควรเรียกใช้ฟังก์ชันโดยไม่ตรวจสอบ int numberOfBytes = ... memmove( dest, source, numberOfBytes ); การตรวจสอบข้อมูลโค้ดในอดีตจำเป็นหรือไม่
104 c++  c  pointers  memcpy  memmove 

7
การสร้างสตริงที่จัดรูปแบบ C (ไม่ได้พิมพ์)
ฉันมีฟังก์ชันที่รับสตริงนั่นคือ: void log_out(char *); ในการเรียกมันฉันต้องสร้างสตริงที่จัดรูปแบบทันทีเช่น: int i = 1; log_out("some text %d", i); ฉันจะทำสิ่งนี้ใน ANSI C ได้อย่างไร? เท่านั้นเนื่องจากsprintf()ส่งคืน int ซึ่งหมายความว่าฉันต้องเขียนอย่างน้อย 3 คำสั่งเช่น: char *s; sprintf(s, "%d\t%d", ix, iy); log_out(s); วิธีใดที่จะทำให้สิ่งนี้สั้นลง?
104 c  string 


4
การลบจำนวนเต็มไม่ได้ลงนามกำหนดพฤติกรรมหรือไม่
ฉันเจอรหัสจากใครบางคนที่ดูเหมือนจะเชื่อว่ามีปัญหาในการลบจำนวนเต็มที่ไม่ได้ลงชื่อออกจากจำนวนเต็มอื่นที่เป็นประเภทเดียวกันเมื่อผลลัพธ์เป็นลบ ดังนั้นรหัสแบบนี้จะไม่ถูกต้องแม้ว่าจะใช้งานได้กับสถาปัตยกรรมส่วนใหญ่ก็ตาม unsigned int To, Tf; To = getcounter(); while (1) { Tf = getcounter(); if ((Tf-To) >= TIME_LIMIT) { break; } } นี่เป็นเพียงคำพูดที่เกี่ยวข้องอย่างคลุมเครือจากมาตรฐาน C ที่ฉันหาได้ การคำนวณที่เกี่ยวข้องกับตัวถูกดำเนินการที่ไม่ได้ลงนามไม่สามารถเกิน fl โอ๊ยได้เนื่องจากผลลัพธ์ที่ไม่สามารถแสดงโดยประเภทจำนวนเต็มที่ไม่ได้ลงนามที่เป็นผลลัพธ์จะลดโมดูโลจำนวนที่มากกว่าค่าที่มากที่สุดค่าหนึ่งที่สามารถแสดงโดยประเภทผลลัพธ์ได้ ฉันคิดว่าอาจใช้คำพูดนั้นเพื่อหมายความว่าเมื่อตัวถูกดำเนินการด้านขวามีขนาดใหญ่ขึ้นการดำเนินการจะถูกปรับให้มีความหมายในบริบทของตัวเลขที่ถูกตัดทอนโมดูโล กล่าวคือ 0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF เมื่อเทียบกับการใช้ความหมายที่ลงนามขึ้นอยู่กับการใช้งาน: 0x0000 - 0x0001 == (ไม่ได้ลงนาม) (0 + …

7
การพิมพ์อักขระเลขฐานสิบหกใน C
ฉันกำลังพยายามอ่านเป็นบรรทัดของอักขระจากนั้นพิมพ์เลขฐานสิบหกที่เทียบเท่าของอักขระ ตัวอย่างเช่นถ้าฉันมีสตริงที่"0xc0 0xc0 abc123"2 ตัวแรกเป็นc0เลขฐานสิบหกและอักขระที่เหลืออยู่abc123ใน ASCII ฉันควรจะได้รับ c0 c0 61 62 63 31 32 33 อย่างไรก็ตามการprintfใช้%xให้ฉัน ffffffc0 ffffffc0 61 62 63 31 32 33 ฉันจะได้ผลลัพธ์ที่ต้องการโดยไม่ต้องทำ"ffffff"อย่างไร และเหตุใดจึงมีเพียง c0 (และ 80) เท่านั้นที่มีffffffแต่อักขระอื่น ๆ ไม่ได้?
104 c  hex  printf 

8
“ argv [0] = name-of-executable” เป็นมาตรฐานที่ยอมรับหรือเป็นเพียงแบบแผนทั่วไป
เมื่อส่งอาร์กิวเมนต์ไปยังmain()แอปพลิเคชัน C หรือ C ++ จะargv[0]เป็นชื่อของไฟล์ปฏิบัติการเสมอ? หรือนี่เป็นเพียงอนุสัญญาทั่วไปและไม่รับประกันว่าจะเป็นจริง 100% ของเวลา?
104 c++  c  standards  argv 

7
CRC32 checksum คำนวณอย่างไร
บางทีฉันอาจจะไม่เห็น แต่ CRC32 ดูเหมือนจะซับซ้อนโดยไม่จำเป็นหรืออธิบายไม่เพียงพอในทุกที่ที่ฉันพบบนเว็บ ฉันเข้าใจว่ามันเป็นส่วนที่เหลือจากการหารเลขคณิตแบบไม่ถือตามค่าของข้อความหารด้วยพหุนาม (ตัวสร้าง) แต่การนำไปใช้จริงทำให้ฉันหนีไป ฉันได้อ่าน คำแนะนำที่ไม่เจ็บปวดสำหรับอัลกอริทึมการตรวจจับข้อผิดพลาด CRCและฉันต้องบอกว่ามันไม่เจ็บปวด มันเป็นไปตามทฤษฎีที่ค่อนข้างดี แต่ผู้เขียนไม่เคยเข้าใจง่ายๆว่า "นี่มัน" เขาบอกว่าพารามิเตอร์สำหรับอัลกอริทึม CRC32 มาตรฐานคืออะไร แต่เขาละเลยที่จะอธิบายอย่างชัดเจนว่าคุณจะไปถึงมันอย่างไร ส่วนที่ทำให้ฉันเข้าใจคือเมื่อเขาพูดว่า "นี่ไง" จากนั้นก็พูดว่า "โอ้ยังไงก็ตามมันสามารถย้อนกลับหรือเริ่มต้นด้วยเงื่อนไขเริ่มต้นที่แตกต่างกันได้" และไม่ได้ให้คำตอบที่ชัดเจนว่าวิธีสุดท้ายคืออะไร ของการคำนวณการตรวจสอบ CRC32 จากการเปลี่ยนแปลงทั้งหมดที่เขาเพิ่งเพิ่มเข้าไป มีคำอธิบายที่ง่ายกว่านี้เกี่ยวกับวิธีคำนวณ CRC32 หรือไม่? ฉันพยายามเขียนโค้ดใน C ว่าตารางถูกสร้างขึ้นอย่างไร: for (i = 0; i < 256; i++) { temp = i; for (j = 0; j < 8; …
104 c  checksum  crc32 

4
-D_XOPEN_SOURCE ทำ / หมายถึงอะไร
ฉันเพิ่งพบโค้ดบางอย่างที่ gcc ไม่สามารถคอมไพล์ได้หากไม่มีอาร์กิวเมนต์นี้ ฉันตรวจสอบหน้าคน gcc แล้ว แต่ไม่พบตัวเลือกเฉพาะนี้ ฉันพบXOPEN_SOURCEแต่ไม่มีคำอธิบายเล็กน้อยเกี่ยวกับสิ่งที่ทำ ใครช่วยอธิบายให้ละเอียดหน่อยได้ไหม ฉันรู้ว่า-D_XOPEN_SOURCEสามารถตั้งค่าที่แตกต่างกันเช่น400, 600แต่สิ่งที่ทำเหล่านั้นหรือไม่
104 c  gcc 

6
การเขียนโปรแกรม C ใน Visual Studio
ฉันสามารถใช้ Visual Studio เพื่อเรียนรู้การเขียนโปรแกรม C ได้หรือไม่ ในเมนูโครงการใหม่ฉันสามารถเลือกระหว่าง Visual Basic, Visual C #, Visual C ++, Visual F # และอื่น ๆ แต่ฉันไม่เห็น "C" หรือ "Visual C"
104 c  visual-studio 


8
ตัวระบุความกว้าง Printf เพื่อรักษาความแม่นยำของค่าทศนิยม
มีตัวprintfระบุความกว้างที่สามารถนำไปใช้กับตัวระบุจุดลอยตัวที่จะจัดรูปแบบผลลัพธ์โดยอัตโนมัติเป็นจำนวนหลักสำคัญที่จำเป็นเช่นนั้นเมื่อสแกนสตริงกลับเข้าไปจะได้รับค่าทศนิยมเดิมหรือไม่ ตัวอย่างเช่นสมมติว่าฉันพิมพ์ a floatด้วยความแม่นยำของ2ตำแหน่งทศนิยม: float foobar = 0.9375; printf("%.2f", foobar); // prints out 0.94 เมื่อฉันสแกนผลลัพธ์0.94ฉันไม่มีการรับประกันที่เป็นไปตามมาตรฐานว่าฉันจะได้ค่า0.9375ทศนิยมดั้งเดิมกลับคืนมา (ในตัวอย่างนี้ฉันอาจจะไม่) ฉันต้องการวิธีบอกprintfให้พิมพ์ค่าทศนิยมไปยังจำนวนหลักที่จำเป็นโดยอัตโนมัติเพื่อให้แน่ใจว่าสามารถสแกนกลับไปเป็นค่าเดิมที่ส่งไปให้printfได้ ฉันสามารถใช้มาโครบางตัวfloat.hเพื่อหาค่าความกว้างสูงสุดที่จะส่งผ่านไปprintfได้ แต่มีตัวระบุให้พิมพ์โดยอัตโนมัติตามจำนวนหลักที่มีนัยสำคัญหรือไม่หรืออย่างน้อยก็เป็นความกว้างสูงสุด

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