2013-07-30 30 views
31

Ví dụ:Làm các chuỗi ký tự kết thúc bằng một terminator null có chứa một null-terminator không?

char a[] = "abc\0"; 

Liệu tiêu chuẩn C nói rằng một byte có giá trị 0 phải được nối ngay cả khi chuỗi đã có một số không ở cuối? Vì vậy, là sizeof(a) bằng 4 hoặc 5?

+1

Hoàn toàn không có gì sai với tiếng Anh trong câu hỏi của bạn. Nhưng bạn không thể tìm thấy câu trả lời chỉ bằng cách thử nó? – Barmar

+2

Nếu bạn muốn rõ ràng, bạn có thể viết: 'char a [] = {'a', 'b', 'c', '\ 0'};'. Điều này không được khai báo như là một chuỗi ký tự sao cho một null kết thúc thêm không được nối thêm. –

+0

Hoặc, bạn có thể viết 'char a [4] =" abc \ 0 ";'. – nwellnhof

Trả lời

50

Tất cả các chuỗi ký tự có một trình kết thúc rỗng ẩn, không phân biệt nội dung của chuỗi.

Tiêu chuẩn (6.4.5 Chuỗi Literals) nói:

Một byte hoặc mã có giá trị không được gắn cho mỗi chuỗi ký tự multibyte mà kết quả từ một chuỗi chữ hoặc literals.

Vì vậy, chuỗi ký tự "abc\0" chứa trình kết thúc rỗng ngầm định, ngoài dấu gạch ngang rõ ràng. Vì vậy, mảng a chứa 5 phần tử.

+0

'Vì vậy, mảng a chứa 5 phần tử.' Bạn có nghĩa là các phần tử '4' không? –

+10

@BikalGurung: Không, 5 là chính xác. {'a', 'b', 'c', '\ 0', '\ 0'} –

Các vấn đề liên quan