Но что, если я хочу напечатать строку, скажем 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
?