มันเป็นการปฏิบัติที่ไม่ดีเลยที่จะเริ่มต้นชุดอักขระถ่านด้วยตัวอักษรสตริง
ผู้เขียนความคิดเห็นนั้นไม่เคยพิสูจน์ความจริงเลยและฉันพบว่าคำสั่งนั้นทำให้งง
ใน C (และคุณติดแท็กเป็น C) นั่นเป็นวิธีเดียวที่จะเริ่มต้นอาร์เรย์char
ด้วยค่าสตริง (การเริ่มต้นนั้นแตกต่างจากการกำหนด) คุณสามารถเขียนได้
char string[] = "october";
หรือ
char string[8] = "october";
หรือ
char string[MAX_MONTH_LENGTH] = "october";
ในกรณีแรกขนาดของอาร์เรย์จะถูกนำมาจากขนาดของ initializer สตริงตัวอักษรจะถูกเก็บไว้เป็นอาร์เรย์ของchar
ด้วยการสิ้นสุด 0 ไบต์ดังนั้นขนาดของอาร์เรย์คือ 8 ('o', 'c', 't', 't', 'o', 'b', 'e', 'r', 0) ในสองกรณีที่สองขนาดของอาร์เรย์จะถูกระบุเป็นส่วนหนึ่งของการประกาศ (8 และMAX_MONTH_LENGTH
สิ่งที่เกิดขึ้น)
สิ่งที่คุณไม่สามารถทำได้คือเขียนสิ่งที่ชอบ
char string[];
string = "october";
หรือ
char string[8];
string = "october";
ฯลฯ ในกรณีแรกประกาศของstring
คือไม่สมบูรณ์เพราะไม่มีขนาดอาร์เรย์ได้รับการระบุและมีการเริ่มต้นที่จะใช้ขนาดจากไม่มี ในทั้งสองกรณีตัวดำเนินการ=
จะไม่ทำงานเนื่องจาก a) นิพจน์อาร์เรย์เช่นstring
อาจไม่ใช่เป้าหมายของการมอบหมายและ b) ตัว=
ดำเนินการไม่ได้ถูกกำหนดให้คัดลอกเนื้อหาของอาร์เรย์หนึ่งไปยังอีกแถวหนึ่ง
ด้วยโทเค็นเดียวกันคุณไม่สามารถเขียนได้
char string[] = foo;
ที่เป็นอาร์เรย์ของผู้อื่นfoo
char
การเริ่มต้นรูปแบบนี้จะทำงานกับตัวอักษรสตริงเท่านั้น
แก้ไข
ฉันควรแก้ไขสิ่งนี้เพื่อบอกว่าคุณยังสามารถเริ่มต้นอาร์เรย์เพื่อเก็บสตริงด้วย initializer สไตล์อาร์เรย์เช่น
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
หรือ
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
แต่จะเป็นการง่ายกว่าที่จะใช้ตัวอักษรสตริง
แก้ไข2
ในการกำหนดเนื้อหาของอาร์เรย์นอกการประกาศคุณจะต้องใช้strcpy/strncpy
(สำหรับสตริงที่สิ้นสุดด้วย 0) หรือmemcpy
(สำหรับอาร์เรย์ประเภทอื่น ๆ ):
if (sizeof string > strlen("october"))
strcpy(string, "october");
หรือ
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!