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

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

10
เหตุใด memcpy () และ memmove () จึงเร็วกว่าการเพิ่มตัวชี้
ฉันกำลังคัดลอก N ไบต์จากไปpSrc pDestสามารถทำได้ในลูปเดียว: for (int i = 0; i < N; i++) *pDest++ = *pSrc++ ทำไมช้ากว่านี้memcpyหรือmemmove? พวกเขาใช้เทคนิคอะไรเพื่อเร่งความเร็ว?
92 c++  c  loops 

3
UNIX nonblocking I / O: O_NONBLOCK เทียบกับ FIONBIO
ในทุกตัวอย่างและการสนทนาที่ฉันใช้ในบริบทของการเขียนโปรแกรมซ็อกเก็ต BSD ดูเหมือนว่าวิธีที่แนะนำในการตั้งค่าตัวอธิบายไฟล์เป็นโหมด I / O ที่ไม่ปิดกั้นคือการใช้O_NONBLOCKแฟล็กเพื่อfcntl()เช่น int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); ฉันทำการเขียนโปรแกรมเครือข่ายใน UNIX มานานกว่าสิบปีแล้วและใช้การFIONBIO ioctl()โทรเพื่อทำสิ่งนี้มาโดยตลอด: int opt = 1; ioctl(fd, FIONBIO, &opt); ไม่เคยคิดมากว่าทำไม เพิ่งเรียนรู้วิธีนี้ ใครมีความเห็นเกี่ยวกับข้อดีของข้อใดข้อหนึ่งหรือไม่? ฉันคิดว่าโลคัสการพกพานั้นแตกต่างกันบ้าง แต่ไม่รู้ว่าioctl_list(2)มันไม่ได้พูดถึงแง่มุมของแต่ละioctlวิธี



9
เริ่มต้น / รีเซ็ตโครงสร้างเป็นศูนย์ / ศูนย์
struct x { char a[10]; char b[20]; int i; char *c; char *d[10]; }; ฉันเติมโครงสร้างนี้แล้วใช้ค่า ในการทำซ้ำครั้งถัดไปฉันต้องการรีเซ็ตฟิลด์ทั้งหมดเป็น0หรือnullก่อนที่จะเริ่มใช้ซ้ำ ฉันจะทำเช่นนั้นได้อย่างไร? ใช้ได้memsetไหมหรือต้องผ่านสมาชิกทั้งหมดแล้วทำทีละคน


10
ค่าคู่ขั้นต่ำใน C / C ++
มีวิธีมาตรฐานและ / หรือแบบพกพาในการแทนค่าลบที่เล็กที่สุด (เช่นการใช้อินฟินิตี้เชิงลบ) ในโปรแกรม C (++) หรือไม่? DBL_MIN ใน float.h เป็นจำนวนบวกที่น้อยที่สุด
92 c++  c  math 

10
วิธีเปรียบเทียบสตริงใน C เงื่อนไขคำสั่งพรีโปรเซสเซอร์
ฉันต้องทำสิ่งนี้ใน C มันใช้ได้ก็ต่อเมื่อฉันใช้ถ่าน แต่ฉันต้องการสตริง ฉันจะทำเช่นนี้ได้อย่างไร? #define USER "jack" // jack or queen #if USER == "jack" #define USER_VS "queen" #elif USER == "queen" #define USER_VS "jack" #endif

5
วิธีที่ถูกต้องในการประกาศตัวแปรตัวชี้ใน C / C ++ [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ฉันสังเกตเห็นบางคนใช้สัญกรณ์ต่อไปนี้ในการประกาศตัวแปรตัวชี้ (a) char* p; แทน (b) char *p; ฉันใช้ (b) อะไรคือเหตุผลที่อยู่เบื้องหลังสัญกรณ์ (ก)? สัญกรณ์ (b) มีความหมายสำหรับฉันมากขึ้นเนื่องจากตัวชี้อักขระไม่ใช่ประเภทเอง แทนที่จะเป็นประเภทอักขระและตัวแปรอาจเป็นตัวชี้ไปยังอักขระ char* c; ดูเหมือนว่ามีประเภท char * และตัวแปร c เป็นประเภทนั้น แต่ในความเป็นจริงประเภทคือถ่านและ * c (ตำแหน่งหน่วยความจำที่ชี้โดย c) เป็นประเภทนั้น (ถ่าน) หากคุณประกาศตัวแปรหลายตัวพร้อมกันความแตกต่างนี้จะชัดเจน char* c, *d; มันดูแปลก ๆ ทั้ง c และ d เป็นพอยน์เตอร์ชนิดเดียวกันที่ชี้ไปที่อักขระ …
92 c++  c  pointers  coding-style 

4
PTHREAD_MUTEX_INITIALIZER เทียบกับ pthread_mutex_init (& mutex, param)
มีความแตกต่างระหว่าง pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; หรือ pthread_mutex_t lock; pthread_mutex_init ( &lock, NULL); ฉันปลอดภัยเพียงพอหรือไม่หากใช้เพียงวิธีแรก หมายเหตุ:คำถามของฉันส่วนใหญ่หมายถึงโปรแกรมขนาดเล็กมากซึ่งสิ่งที่ฉันจะทำมากที่สุดคือเชื่อมต่อไคลเอนต์หลายรายเข้ากับเซิร์ฟเวอร์และแก้ไขข้อสงสัยด้วยเธรดของผู้ปฏิบัติงาน
92 c  ubuntu  pthreads  mutex 

3
exec เวอร์ชันต่างๆที่ใช้ใน C และ C ++ มีอะไรบ้าง?
นี่คือเวอร์ชันทั้งหมดของ exec ที่สามารถใช้ได้ใน C (และ C ++) execl execle execlp execv execve execvp อะไรคือความแตกต่างระหว่างพวกเขา? คุณรู้ได้อย่างไรว่าควรใช้อันไหน?
92 c++  c  exec 

5
ข้อผิดพลาดร้ายแรงของ GCC: stdio.h: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันพยายามรวบรวมโปรแกรมใน C บน OS X 10.9 ด้วย GCC 4.9 (ทดลอง) ด้วยเหตุผลบางประการฉันได้รับข้อผิดพลาดต่อไปนี้ในเวลาคอมไพล์: gcc: fatal error: stdio.h: No such file or directory จากนั้นฉันลองใช้โปรแกรม Hello World ง่ายๆ: #include <stdio.h> int main(int argc, const char *argv[]) { printf("Hello, world!"); return 0; } อีกครั้งเมื่อทำงานgcc -o ~/hello ~/hello.cฉันได้รับข้อผิดพลาดเดียวกัน ผมใช้รุ่นทดลองแต่ดูเหมือนว่าไม่น่าเชื่อว่าจะมีการเปิดตัวที่สร้างข้อผิดพลาดเมื่อนำเข้าgcc stdioอะไรอาจทำให้เกิดปัญหานี้และจะแก้ไขได้อย่างไร
92 c  gcc  stdio 

4
ตัวอย่าง C ง่ายๆของการทำ HTTP POST และใช้การตอบสนอง
ฉันต้องการสร้างแอปพลิเคชัน C ที่เรียบง่ายซึ่งทำโพสต์ HTTP ใช้พารามิเตอร์สองสามตัวและใช้พารามิเตอร์เหล่านี้เพื่อสร้าง URL ฉันแค่ต้องการทำ HTTP POST แบบง่ายๆและรับการตอบสนองโดยไม่ต้องใช้ curl (ไลบรารีไม่ได้และจะไม่ได้รับการติดตั้งบนเครื่องซึ่งจำเป็นต้องเรียกใช้) รหัสหลอก: กระบวนการ 2 args ใส่ args ลงใน URL เทมเพลต: http://api.somesite.com/apikey=ARG1&command=ARG2 ทำ POST บน URL ที่สร้างขึ้น ใช้การตอบสนอง การค้นหา Google และ SO ของฉันไม่ได้ให้ผลอะไรในเรื่องนี้
92 c  http  http-post 

17
สลับคำสั่งกับผลตอบแทน - ความถูกต้องของรหัส
สมมติว่าฉันมีรหัสใน C โดยมีโครงสร้างประมาณนี้: switch (something) { case 0: return "blah"; break; case 1: case 4: return "foo"; break; case 2: case 3: return "bar"; break; default: return "foobar"; break; } เห็นได้ชัดว่าbreaks ไม่จำเป็นสำหรับรหัสที่จะทำงานอย่างถูกต้อง แต่ดูเหมือนว่าจะเป็นการปฏิบัติที่ไม่ดีถ้าฉันไม่ใส่ให้ฉัน คุณคิดอย่างไร? ลบออกได้ไหม หรือคุณจะเก็บไว้เพื่อเพิ่ม "ความถูกต้อง"?

28
ตัวชี้การทดสอบความถูกต้อง (C / C ++)
มีวิธีใดในการตรวจสอบ (โดยทางโปรแกรมแน่นอน) ว่าตัวชี้ที่ระบุ "ถูกต้อง" การตรวจสอบค่า NULL นั้นง่าย แต่สิ่งที่เกี่ยวกับ 0x00001234? เมื่อพยายามหักล้างตัวชี้ชนิดนี้จะมีข้อยกเว้น / ข้อขัดข้องเกิดขึ้น แนะนำให้ใช้วิธีข้ามแพลตฟอร์ม แต่เฉพาะแพลตฟอร์ม (สำหรับ Windows และ Linux) ก็ใช้ได้เช่นกัน อัปเดตเพื่อการชี้แจง: ปัญหาไม่ได้อยู่ที่พอยน์เตอร์เก่า / เป็นอิสระ / ไม่ได้กำหนดค่าเริ่มต้น ฉันกำลังใช้ API ที่รับตัวชี้จากผู้โทรแทน (เช่นตัวชี้ไปยังสตริงตัวจัดการไฟล์ ฯลฯ ) ผู้โทรสามารถส่ง (ด้วยจุดประสงค์หรือโดยไม่ได้ตั้งใจ) ค่าที่ไม่ถูกต้องเป็นตัวชี้ ฉันจะป้องกันความผิดพลาดได้อย่างไร
92 c++  c  validation  pointers  null 

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