Aber was ist, wenn ich einen String drucken wollte, sagen Sie printf ("Hallo"), obwohl ich festgestellt habe, dass er nicht mit \ 0 endet, indem ich der folgenden Anweisung folge
printf("%d", printf("hello"));
Output: 5
Sie liegen falsch. Diese Anweisung bestätigt nicht, dass das Zeichenfolgenliteral "hello"
nicht mit dem abschließenden Nullzeichen endet '\0'
. Diese Anweisung bestätigte, dass die Funktion printf
Elemente einer Zeichenfolge ausgibt, bis das abschließende Nullzeichen gefunden wird.
Wenn Sie ein Zeichenfolgenliteral wie in der obigen Anweisung verwenden, erstellt der Compiler ein Zeichenarray mit der statischen Speicherdauer, das Elemente des Zeichenfolgenliteral enthält.
Also in der Tat dieser Ausdruck
printf("hello")
wird vom Compiler wie folgt verarbeitet
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );
Die Aktion der Funktion printf in diesem können Sie sich folgendermaßen vorstellen
int printf( const char *string_literal )
{
int result = 0;
for ( ; *string_literal != '\0'; ++string_literal )
{
putchar( *string_literal );
++result;
}
return result;
}
Um die Anzahl der im String-Literal "Hallo" gespeicherten Zeichen zu ermitteln, können Sie das folgende Programm ausführen
#include <stdio.h>
int main(void)
{
char literal[] = "hello";
printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );
return 0;
}
Die Programmausgabe ist
The size of the literal "hello" is 6
);
Was wollen Sie mit diesem Code zeigen, abgesehen davon , dass Ihr Code zumindest fehlt ? Wie haben Sie bewiesen, dass es nicht mit einem endet\0
?