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

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

7
size_t เทียบกับ uintptr_t
มาตรฐาน C รับประกันว่าsize_tเป็นประเภทที่สามารถเก็บดัชนีอาร์เรย์ใด ๆ ซึ่งหมายความว่ามีเหตุผลsize_tควรจะสามารถเก็บตัวชี้ใด ๆ ฉันได้อ่านในเว็บไซต์บางแห่งที่ฉันพบใน Googles ว่าถูกกฎหมายและ / หรือควรทำงาน: void *v = malloc(10); size_t s = (size_t) v; ดังนั้นใน C99 มาตรฐานแนะนำintptr_tและuintptr_tประเภทซึ่งลงนามและไม่ได้ลงนามประเภทรับประกันว่าจะสามารถเก็บพอยน์เตอร์: uintptr_t p = (size_t) v; ดังนั้นความแตกต่างระหว่างการใช้size_tและuintptr_tคืออะไร? ทั้งสองแบบไม่ได้ลงนามและทั้งคู่ควรจะสามารถถือตัวชี้ประเภทใดก็ได้ มีเหตุผลที่น่าสนใจจริง ๆuintptr_tหรือไม่ที่จะใช้(หรือดีกว่า, a void *) มากกว่า a size_t, มากกว่าความชัดเจน? ในโครงสร้างทึบซึ่งเขตข้อมูลจะถูกจัดการโดยฟังก์ชันภายในเท่านั้นมีเหตุผลใดที่จะไม่ทำเช่นนี้หรือไม่? ด้วยโทเค็นเดียวกันptrdiff_tมีชนิดที่มีลายเซ็นสามารถถือความแตกต่างของตัวชี้ได้และดังนั้นจึงสามารถจับตัวชี้ส่วนใหญ่ได้ดังนั้นจึงแตกต่างจากintptr_tอย่างไร ไม่ทุกประเภทเหล่านี้โดยทั่วไปให้บริการฟังก์ชั่นรุ่นเดียวกันที่แตกต่างกันเล็กน้อย? ถ้าไม่ทำไม ฉันไม่สามารถทำอะไรกับหนึ่งในนั้นที่ฉันไม่สามารถทำกับคนอื่นได้? ถ้าเป็นเช่นนั้นเหตุใด C99 จึงเพิ่มประเภทฟุ่มเฟือยสองประเภทลงในภาษา ฉันยินดีที่จะเพิกเฉยต่อพอยน์เตอร์ของฟังก์ชั่นเนื่องจากมันไม่ได้ใช้กับปัญหาปัจจุบัน แต่อย่าลังเลที่จะพูดถึงมันเนื่องจากฉันมีความสงสัยที่ด้อมพวกเขาจะเป็นศูนย์กลางของคำตอบที่ "ถูกต้อง"
246 c  pointers  size-t 

9
ตรวจพบสแตกยอดเยี่ยม
ฉันกำลังเรียกใช้ไฟล์ a.out ของฉัน หลังจากการดำเนินการโปรแกรมจะทำงานเป็นระยะเวลาหนึ่งแล้วออกจากพร้อมข้อความ: **** stack smashing detected ***: ./a.out terminated* *======= Backtrace: =========* */lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted* อะไรคือสาเหตุที่เป็นไปได้สำหรับสิ่งนี้และฉันจะแก้ไขได้อย่างไร
246 c  exception  stack 

12
มี Java หรือวิธีการเทียบเท่าสำหรับคำหลัก typedef ใน C ++ หรือไม่
มาจากพื้นหลัง C และ C ++ ฉันพบว่าการใช้ประโยชน์อย่างรอบคอบนั้นtypedefมีประโยชน์อย่างไม่น่าเชื่อ คุณรู้วิธีที่จะใช้ฟังก์ชันการทำงานที่คล้ายกันใน Java ไม่ว่าจะเป็นกลไก Java, รูปแบบ, หรือวิธีที่มีประสิทธิภาพอื่น ๆ ที่คุณใช้?
244 java  c++  c  design-patterns  typedef 

2
วิธีใช้ #ifdef พร้อมเงื่อนไข OR
ขออภัยที่ถามคำถามพื้นฐานมาก ฉันต้องการตั้งค่าหรือเงื่อนไขใน #ifdef directive ทำอย่างไร ฉันเหนื่อย #ifdef LINUX | ANDROID ... .. #endif มันไม่ได้ผล? วิธีที่เหมาะสมคืออะไร?
244 c  macros 

26
อัลกอริทึมที่มีประสิทธิภาพสำหรับการกลับบิต (จาก MSB-> LSB ถึง LSB-> MSB) ใน C
อัลกอริทึมที่มีประสิทธิภาพที่สุดคืออะไร 0010 0000 => 0000 0100 การแปลงมาจาก MSB-> LSB เป็น LSB-> MSB บิตทั้งหมดจะต้องย้อนกลับ; นั่นคือนี่คือไม่ใช่ endianness-swapping

12
'สลับ' เร็วกว่า 'ถ้า' หรือไม่
เป็นswitchคำสั่งจริงเร็วกว่าifคำสั่ง? ฉันรันโค้ดด้านล่างในคอมไพเลอร์ x64 C ++ ของ Visual Studio 2010 ด้วย/Oxค่าสถานะ: #include <stdlib.h> #include <stdio.h> #include <time.h> #define MAX_COUNT (1 << 29) size_t counter = 0; size_t testSwitch() { clock_t start = clock(); size_t i; for (i = 0; i < MAX_COUNT; i++) { switch (counter % 4 + 1) { …

14
เหตุใดจึงเป็นเช่นนี้สำหรับการออกจากลูปในบางแพลตฟอร์มและไม่ใช่ในแพลตฟอร์มอื่น
ฉันเพิ่งเริ่มเรียนรู้ C และฉันกำลังเรียนกับ C เป็นหัวเรื่อง ฉันกำลังเล่นกับลูปและฉันพบกับพฤติกรรมแปลก ๆ ซึ่งฉันไม่รู้จะอธิบายอย่างไร #include <stdio.h> int main() { int array[10],i; for (i = 0; i <=10 ; i++) { array[i]=0; /*code should never terminate*/ printf("test \n"); } printf("%d \n", sizeof(array)/sizeof(int)); return 0; } ในแล็ปท็อปที่ใช้ Ubuntu 14.04 รหัสนี้จะไม่หยุด มันจะเสร็จสมบูรณ์ บนคอมพิวเตอร์ของโรงเรียนที่ใช้ CentOS 6.6 มันก็ทำงานได้ดี บน Windows 8.1 …

14
วิธีการทำให้ฟังก์ชั่นโอเวอร์โหลดใน C เป็นอย่างไร?
มีวิธีใดบ้างที่จะทำให้เกิดการโอเวอร์โหลดของฟังก์ชันใน C? ฉันกำลังมองหาฟังก์ชั่นง่าย ๆ ที่จะโหลดมากเกินไปเช่น foo (int a) foo (char b) foo (float c , int d) ฉันคิดว่าไม่มีทางตรงไปข้างหน้า; ฉันกำลังมองหาวิธีแก้ไขหากมีอยู่
240 c  overloading 

7
ทำความเข้าใจกับ typedefs สำหรับพอยน์เตอร์ของฟังก์ชันใน C
ฉันมักจะนิ่งงันอยู่เสมอเมื่อฉันอ่านรหัสของคนอื่นซึ่งมี typedefs สำหรับตัวชี้ไปยังฟังก์ชันที่มีอาร์กิวเมนต์ ฉันจำได้ว่ามันต้องใช้เวลาสักพักกว่าจะได้คำนิยามดังกล่าวในขณะที่พยายามทำความเข้าใจกับอัลกอริธึมเชิงตัวเลขที่เขียนด้วย C เมื่อไม่นานมานี้ ดังนั้นคุณสามารถแบ่งปันเคล็ดลับและความคิดของคุณเกี่ยวกับวิธีเขียน typedefs ที่ดีสำหรับตัวชี้ไปยังฟังก์ชัน (Do's and Do's Do) ทำไมพวกเขาถึงมีประโยชน์และทำความเข้าใจงานของผู้อื่นได้อย่างไร ขอบคุณ!

5
pty และ tty หมายถึงอะไร
ฉันสังเกตเห็นว่ามีหลายคนกล่าวถึงptyและttyในโครงการโอเพนซอร์สบางคนสามารถบอกฉันได้ว่าพวกเขาหมายถึงอะไรและอะไรคือความแตกต่างระหว่างพวกเขา ขอบคุณ!
237 c  unix  networking  tty  vocabulary 


13
การลบอักขระบรรทัดใหม่ต่อท้ายจากอินพุต fgets ()
ฉันพยายามรับข้อมูลจากผู้ใช้และส่งไปยังฟังก์ชันอื่นในหน่วย gcc รหัสคืออะไรเช่นนี้ printf("Enter your Name: "); if (!(fgets(Name, sizeof Name, stdin) != NULL)) { fprintf(stderr, "Error reading Name.\n"); exit(1); } อย่างไรก็ตามฉันพบว่ามันมี\nตัวละครขึ้นบรรทัดใหม่ในตอนท้าย ดังนั้นถ้าฉันใส่มันจบลงด้วยการส่งJohn John\nฉันจะลบ\nและส่งสตริงที่เหมาะสมได้อย่างไร
236 c  string  gcc  newline  fgets 

10
วิธีการใช้คำหลัก extern ใน C อย่างถูกต้อง
คำถามของฉันเป็นเรื่องเกี่ยวกับเมื่อฟังก์ชันควรจะอ้างอิงกับexternคำหลักใน C. ฉันไม่เห็นว่าควรนำไปใช้ในทางปฏิบัติเมื่อใด ขณะที่ฉันกำลังเขียนโปรแกรมฟังก์ชั่นทั้งหมดที่ฉันใช้นั้นมีให้ผ่านไฟล์ส่วนหัวที่ฉันได้รวมไว้ เหตุใดจึงเป็นประโยชน์ที่externจะเข้าถึงสิ่งที่ไม่ได้แสดงในไฟล์ส่วนหัว ฉันอาจจะคิดเกี่ยวกับวิธีการexternทำงานที่ไม่ถูกต้องและถ้าเป็นเช่นนั้นโปรดแก้ไขฉัน แก้ไข:คุณควรexternบางสิ่งบางอย่างเมื่อมันเป็นการประกาศเริ่มต้นโดยไม่มีคำหลักในไฟล์ส่วนหัว?
235 c 

26
คำถามสัมภาษณ์: ตรวจสอบว่าสายหนึ่งมีการหมุนของสายอื่น ๆ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ เพื่อนของฉันถูกถามคำถามต่อไปนี้วันนี้ในการสัมภาษณ์สำหรับตำแหน่งของนักพัฒนาซอฟต์แวร์: ให้สองสายs1และs2คุณจะตรวจสอบว่าs1เป็นรุ่นที่หมุนได้s2อย่างไร ตัวอย่าง: ถ้าs1 = "stackoverflow"ต่อไปนี้เป็นเวอร์ชันที่หมุนได้: "tackoverflows" "ackoverflowst" "overflowstack" ในขณะที่"stackoverflwo"เป็นไม่ได้เป็นรุ่นที่หมุน คำตอบที่เขาให้คือ: ใช้เวลาs2และค้นหาคำนำหน้ายาวที่สุดที่เป็นสตริงย่อยของs1ที่จะให้จุดหมุน เมื่อคุณพบจุดนั้นให้หยุดs2ที่จุดนั้นเพื่อรับs2aและs2bจากนั้นตรวจสอบว่าconcatenate(s2a,s2b) == s1 มันดูเหมือนเป็นทางออกที่ดีสำหรับฉันและเพื่อนของฉัน แต่ผู้สัมภาษณ์คิดเป็นอย่างอื่น เขาขอวิธีแก้ปัญหาที่ง่ายกว่า โปรดช่วยฉันด้วยการบอกว่าคุณจะทำสิ่งนี้ได้Java/C/C++อย่างไร? ขอบคุณล่วงหน้า.
235 java  c++  c 

11
#pragma pack effect
ฉันสงสัยว่ามีใครบางคนสามารถอธิบายให้ฉันฟังได้ว่า#pragma packคำสั่ง preprocessor ทำอะไรและที่สำคัญกว่านั้นคือเหตุใดจึงต้องการใช้มัน ฉันเช็คเอาท์หน้า MSDNซึ่งให้ข้อมูลเชิงลึก แต่ฉันหวังว่าจะได้รับความรู้เพิ่มเติมจากผู้ที่มีประสบการณ์ ฉันเคยเห็นมันในรหัสก่อนหน้า แต่ฉันไม่สามารถหาได้อีกต่อไป

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