Але що робити, якщо я хотів надрукувати рядок, скажімо printf ("привіт"), хоча я встановив, що це не закінчується на \ 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;
}
Щоб отримати кількість символів, що зберігаються в прямому рядку "привіт", можна запустити наступну програму
#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?