Nhưng nếu tôi muốn in một chuỗi, hãy nói printf ("xin chào") mặc dù tôi đã thấy rằng nó không kết thúc bằng \ 0 bằng cách làm theo tuyên bố sau
printf("%d", printf("hello"));
Output: 5
Bạn sai rồi. Tuyên bố này không xác nhận rằng chuỗi ký tự "hello"
không kết thúc bằng ký tự zero kết thúc'\0'
. Tuyên bố này đã xác nhận rằng hàm printf
xuất các phần tử của chuỗi cho đến khi gặp ký tự zero kết thúc.
Khi bạn đang sử dụng một chuỗi ký tự như trong câu lệnh trên thì trình biên dịch sẽ tạo ra một mảng ký tự với thời lượng lưu trữ tĩnh có chứa các phần tử của chuỗi ký tự.
Vì vậy, trên thực tế biểu hiện này
printf("hello")
được xử lý bởi trình biên dịch một cái gì đó như sau
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
Hành động của hàm printf trong này bạn có thể tưởng tượng theo cách sau
int printf( const char *string_literal )
{
int result = 0;
for ( ; *string_literal != '\0'; ++string_literal )
{
putchar( *string_literal );
++result;
}
return result;
}
Để có được số lượng ký tự được lưu trữ trong chuỗi "xin chào" bằng chữ, bạn có thể chạy chương trình sau
#include <stdio.h>
int main(void)
{
char literal[] = "hello";
printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );
return 0;
}
Đầu ra của chương trình là
The size of the literal "hello" is 6
);
, bạn dự định thể hiện điều gì với mã đó? Làm thế nào để bạn chứng minh rằng nó không kết thúc với một\0
?