แต่ถ้าฉันต้องการพิมพ์สตริงให้พูด printf ("hello") แม้ว่าฉันจะพบว่ามันไม่ได้จบด้วย \ 0 ตามข้อความต่อไปนี้
printf("%d", printf("hello"));
Output: 5
คุณผิด. คำสั่งนี้ไม่ได้ยืนยันว่าตัวอักษรสตริงไม่ได้จบด้วยตัวอักษรยุติศูนย์"hello"
'\0'
คำสั่งนี้ยืนยันว่าฟังก์ชั่นการprintf
ส่งออกองค์ประกอบของสตริงจนกว่าจะพบอักขระศูนย์สิ้นสุด
เมื่อคุณใช้สตริงตัวอักษรในคำสั่งด้านบนคอมไพเลอร์จะสร้างอาร์เรย์อักขระที่มีระยะเวลาคงที่ที่มีองค์ประกอบของสตริงตัวอักษร
ดังนั้นในความเป็นจริงการแสดงออกนี้
printf("hello")
ถูกประมวลผลโดยคอมไพเลอร์บางอย่างดังต่อไปนี้
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
การกระทำของฟังก์ชั่น printf ในนี้คุณสามารถจินตนาการวิธีต่อไปนี้
int printf( const char *string_literal )
{
int result = 0;
for ( ; *string_literal != '\0'; ++string_literal )
{
putchar( *string_literal );
++result;
}
return result;
}
ในการรับจำนวนอักขระที่เก็บอยู่ในสตริง "hello" ตามตัวอักษรคุณสามารถเรียกใช้โปรแกรมต่อไปนี้
#include <stdio.h>
int main(void)
{
char literal[] = "hello";
printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );
return 0;
}
ผลลัพธ์ของโปรแกรมคือ
The size of the literal "hello" is 6
);
คุณตั้งใจจะแสดงอะไรกับโค้ดนั้น? คุณจะพิสูจน์ได้อย่างไรว่ามันไม่ได้จบลงด้วย\0
?