Có một số cách để tạo một chuỗi các chuỗi trong C. Nếu tất cả các chuỗi sẽ có cùng độ dài (hoặc ít nhất có cùng độ dài tối đa), bạn chỉ cần khai báo một mảng char 2 chiều và gán nếu cần:
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");
Bạn cũng có thể thêm một danh sách các công cụ khởi tạo:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Điều này giả định kích thước và số chuỗi trong trình khởi tạo khớp với kích thước mảng của bạn. Trong trường hợp này, nội dung của từng chuỗi ký tự (chính nó là một mảng char kết thúc bằng 0) được sao chép vào bộ nhớ được phân bổ cho strs. Vấn đề với phương pháp này là khả năng phân mảnh nội bộ; nếu bạn có 99 chuỗi có 5 ký tự trở xuống, nhưng 1 chuỗi dài 20 ký tự, 99 chuỗi sẽ có ít nhất 15 ký tự không sử dụng; đó là một sự lãng phí không gian
Thay vì sử dụng mảng char 2-d, bạn có thể lưu trữ một mảng con trỏ 1-d vào char:
char *strs[NUMBER_OF_STRINGS];
Lưu ý rằng trong trường hợp này, bạn chỉ phân bổ bộ nhớ để giữ các con trỏ tới các chuỗi; bộ nhớ cho các chuỗi phải được phân bổ ở nơi khác (dưới dạng mảng tĩnh hoặc bằng cách sử dụng malloc()
hoặc calloc()
). Bạn có thể sử dụng danh sách trình khởi tạo như ví dụ trước:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Thay vì sao chép nội dung của các hằng chuỗi, bạn chỉ cần lưu trữ các con trỏ tới chúng. Lưu ý rằng hằng chuỗi có thể không ghi được; bạn có thể gán lại con trỏ, như vậy:
strs[i] = "bar";
strs[i] = "foo";
Nhưng bạn không thể thay đổi nội dung của chuỗi; I E,
strs[i] = "bar";
strcpy(strs[i], "foo");
có thể không được phép
Bạn có thể sử dụng malloc()
để phân bổ động bộ đệm cho từng chuỗi và sao chép vào bộ đệm đó:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Khai báo một mảng 2 phần tử con trỏ thành mảng 14 phần tử của char.
char (*a[2])[14]
là một mảng gồm hai con trỏ đến một mảng gồm 14 ký tự.