Dù sao, đó là cách thực hành tồi để khởi tạo một mảng char với một chuỗi ký tự.
Tác giả của bình luận đó không bao giờ thực sự biện minh cho nó, và tôi thấy tuyên bố khó hiểu.
Trong C (và bạn đã gắn thẻ này là C), đó là cách duy nhất để khởi tạo một mảng char
có giá trị chuỗi (khởi tạo khác với gán). Bạn có thể viết
char string[] = "october";
hoặc là
char string[8] = "october";
hoặc là
char string[MAX_MONTH_LENGTH] = "october";
Trong trường hợp đầu tiên, kích thước của mảng được lấy từ kích thước của trình khởi tạo. Các chuỗi ký tự được lưu trữ dưới dạng các mảng char
có 0 byte kết thúc, vì vậy kích thước của mảng là 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). Trong hai trường hợp thứ hai, kích thước của mảng được chỉ định là một phần của khai báo (8 và MAX_MONTH_LENGTH
, bất cứ điều gì xảy ra).
Những gì bạn không thể làm là viết một cái gì đó như
char string[];
string = "october";
hoặc là
char string[8];
string = "october";
vv Trong trường hợp đầu tiên, tuyên bố string
là không đầy đủ vì không có kích thước mảng đã được xác định và không có khởi tạo để có những kích thước từ. Trong cả hai trường hợp, =
sẽ không hoạt động vì a) một biểu thức mảng như string
có thể không phải là mục tiêu của một bài tập và b) =
toán tử không được xác định để sao chép nội dung của một mảng sang một mảng khác.
Tương tự như vậy, bạn không thể viết
char string[] = foo;
nơi foo
là một mảng của char
. Hình thức khởi tạo này sẽ chỉ hoạt động với chuỗi ký tự.
BIÊN TẬP
Tôi nên sửa đổi điều này để nói rằng bạn cũng có thể khởi tạo các mảng để giữ một chuỗi với trình khởi tạo kiểu mảng, như
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
hoặc là
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
nhưng nó dễ dàng hơn trong mắt để sử dụng chuỗi ký tự.
CHỈNH SỬA 2
Để gán nội dung của một mảng bên ngoài khai báo, bạn cần sử dụng strcpy/strncpy
(đối với các chuỗi kết thúc 0) hoặc memcpy
(đối với bất kỳ loại mảng nào khác):
if (sizeof string > strlen("october"))
strcpy(string, "october");
hoặc là
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!