มีหลายวิธีในการสร้างอาร์เรย์ของสตริงใน C หากสตริงทั้งหมดจะมีความยาวเท่ากัน (หรืออย่างน้อยก็มีความยาวสูงสุดเท่ากัน) คุณเพียงประกาศอาร์เรย์ 2 มิติและกำหนดตามความจำเป็น:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
คุณสามารถเพิ่มรายการ initializers ได้เช่นกัน:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
นี่จะถือว่าขนาดและจำนวนของสตริงใน initializer จับคู่กับขนาดอาร์เรย์ของคุณ ในกรณีนี้เนื้อหาของแต่ละสตริงตัวอักษร (ซึ่งเป็นตัวเองอาร์เรย์ถ่านสิ้นสุดลงเป็นศูนย์) จะถูกคัดลอกไปยังหน่วยความจำที่จัดสรรให้กับ STRs ปัญหาด้วยวิธีนี้คือความเป็นไปได้ของการแยกส่วนภายใน หากคุณมี 99 สายอักขระที่มี 5 ตัวอักษรหรือน้อยกว่า แต่ 1 สายที่มีความยาว 20 ตัวอักษร 99 สายจะมีตัวอักษรที่ไม่ได้ใช้อย่างน้อย 15 ตัว นั่นเป็นการสิ้นเปลืองพื้นที่
แทนที่จะใช้ถ่าน 2 มิติคุณสามารถจัดเก็บพอยน์เตอร์อาร์เรย์ 1 มิติเพื่อถ่าน:
char *strs[NUMBER_OF_STRINGS];
โปรดทราบว่าในกรณีนี้คุณได้จัดสรรหน่วยความจำให้เก็บตัวชี้ไว้กับสตริงเท่านั้น หน่วยความจำสำหรับสตริงจะต้องถูกจัดสรรที่อื่น (ไม่ว่าจะเป็นอาร์เรย์คงที่หรือโดยการใช้malloc()
หรือcalloc()
) คุณสามารถใช้รายการ initializer เช่นตัวอย่างก่อนหน้านี้:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
แทนที่จะคัดลอกเนื้อหาของค่าคงที่สตริงคุณเพียงเก็บพอยน์เตอร์ไว้ในนั้น โปรดทราบว่าค่าคงที่สตริงอาจไม่สามารถเขียนได้ คุณสามารถกำหนดตัวชี้อีกครั้งเช่น:
strs[i] = "bar";
strs[i] = "foo";
แต่คุณอาจไม่สามารถเปลี่ยนเนื้อหาของสตริงได้ กล่าวคือ
strs[i] = "bar";
strcpy(strs[i], "foo");
อาจไม่ได้รับอนุญาต
คุณสามารถใช้malloc()
การจัดสรรบัฟเฟอร์แบบไดนามิกสำหรับแต่ละสตริงและคัดลอกไปยังบัฟเฟอร์นั้น:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
ประกาศเป็นอาร์เรย์ 2 พอยน์เตอร์ของพอยน์เตอร์ถึงอาร์เรย์ 14 องค์ประกอบของถ่าน
char (*a[2])[14]
เป็นอาร์เรย์ของสองตัวชี้ไปยังอาร์เรย์ 14 ตัวอักษร