Но что, если я хочу напечатать строку, скажем 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;
}
Чтобы получить количество символов, хранящихся в строковом литерале "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?