สตริงทั้งหมดสามารถพิจารณาว่าเป็นอาร์เรย์ของอักขระ ( ใช่ ) ได้หรือไม่อาร์เรย์อักขระทั้งหมดสามารถถือว่าเป็นสตริง ( ไม่ )
ทำไมจะไม่ล่ะ? และทำไมมันสำคัญ?
นอกเหนือจากคำตอบอื่น ๆ ที่อธิบายว่าความยาวของสตริงไม่ได้ถูกเก็บไว้ที่ใดก็ได้ซึ่งเป็นส่วนหนึ่งของสตริงและการอ้างอิงถึงมาตรฐานที่สตริงถูกกำหนดไว้ฟลิปด้านคือ "ฟังก์ชัน C ไลบรารีจัดการกับสตริงได้อย่างไร"
ในขณะที่อาเรย์ตัวละครสามารถเก็บอักขระตัวเดียวกันได้ แต่เป็นอาเรย์ของตัวละครเว้นแต่ว่าตัวอักษรตัวสุดท้ายจะตามด้วยอักขระที่ยกเลิก นั่นNUL-ยุติตัวละครเป็นสิ่งที่ช่วยให้อาร์เรย์ของตัวอักษรที่จะได้รับการพิจารณา (จัดการเป็น) สตริง
ฟังก์ชั่นทั้งหมดในซีที่คาดว่าสตริงเป็นอาร์กิวเมนต์ลำดับคาดว่าของตัวละครที่จะNUL สิ้นสุด ทำไม?
มันเกี่ยวข้องกับการทำงานของฟังก์ชั่นสตริงทั้งหมด เนื่องจากความยาวไม่ได้รวมอยู่ในอาเรย์, ฟังก์ชั่นสตริง, สแกนไปข้างหน้าในอาเรย์จนกระทั่งพบตัวอักษร nul (เช่น'\0'
- เทียบเท่าทศนิยม0
) ดูASCII โต๊ะและคำอธิบาย โดยไม่คำนึงถึงว่าคุณกำลังใช้strcpy
, strchr
, strcspn
ฯลฯ .. ฟังก์ชันสตริงทั้งหมดพึ่งพาNUL-ยุติตัวละครที่ถูกนำเสนอในการกำหนดที่ปลายสายว่าเป็น
การเปรียบเทียบของสองฟังก์ชันที่คล้ายกันจากstring.h
จะเน้นถึงความสำคัญของอักขระที่ไม่สิ้นสุด ยกตัวอย่างเช่น
char *strcpy(char *dest, const char *src);
strcpy
ฟังก์ชั่นเพียงสำเนาไบต์จากsrc
ไปdest
จนNUL-ยุติตัวอักษรที่พบบอกstrcpy
ว่าจะหยุดการคัดลอกตัวอักษร ตอนนี้ใช้ฟังก์ชั่นที่คล้ายกันmemcpy
:
void *memcpy(void *dest, const void *src, size_t n);
ฟังก์ชั่นทำการดำเนินการที่คล้ายกัน แต่ไม่ได้พิจารณาหรือต้องการให้src
พารามิเตอร์เป็นสตริง เนื่องจากmemcpy
ไม่สามารถเพียงแค่สแกนไปข้างหน้าในsrc
การคัดลอกไบต์ไปdest
จนถึงอักขระnul-terminatingจึงต้องมีจำนวนไบต์ที่ชัดเจนเพื่อคัดลอกเป็นพารามิเตอร์ที่สาม พารามิเตอร์ที่สามนี้มีmemcpy
ข้อมูลขนาดเดียวกันstrcpy
สามารถรับได้โดยการสแกนไปข้างหน้าจนกว่าจะพบอักขระที่สิ้นสุด
(ซึ่งเน้นถึงสิ่งที่ผิดพลาดในstrcpy
(หรือฟังก์ชั่นที่คาดว่าจะเป็นสตริง) หากคุณล้มเหลวในการจัดหาฟังก์ชั่นด้วยสตริงที่สิ้นสุดด้วยnul - มันไม่มีความคิดว่าจะหยุดที่ไหนและจะแข่งกันอย่างมีความสุข การเรียกใช้พฤติกรรมที่ไม่ได้กำหนดจนกระทั่งอักขระ nulเกิดขึ้นที่ใดที่หนึ่งในหน่วยความจำ - หรือมีการแบ่งกลุ่มความผิดพลาดเกิดขึ้น)
นั่นคือเหตุผลที่ฟังก์ชั่นคาดหวังว่าNUL สิ้นสุดสตริงจะต้องผ่านNUL สิ้นสุดสตริงและทำไมมันเรื่อง
char str[] = "hello";
กรณี