En un curso introductorio de C, aprendí que mientras se almacenan las cadenas se almacenan con el carácter nulo \0 al final. Pero, ¿y si quisiera imprimir una cadena, diga printf("hello") aunque descubrí que no termina con \0 siguiendo la siguiente declaración?
printf("%d", printf("hello")); Output: 5pero esto parece ser inconsistente, hasta donde sé, las variables como las cadenas se almacenan en la memoria principal y supongo que al imprimir algo también podría almacenarse en la memoria principal, ¿por qué la diferencia?
printf devuelve el número de caracteres impresos. '\0' no se imprime, solo indica que no hay más caracteres en esta cadena. Tampoco se cuenta para la longitud de la cadena.
int main() { char string[] = "hello"; printf("szieof(string) = %zu, strlen(string) = %zu\n", sizeof(string), strlen(string)); } sizeof(string) = 6, strlen(string) = 5El byte nulo marca el final de una cadena. No se cuenta en la longitud de la cadena y no se imprime cuando se imprime una cadena con printf . Básicamente, el byte nulo le dice a las funciones que manipulan cadenas cuándo detenerse.
Donde verá una diferencia es si crea una char de caracteres inicializada con una cadena. El uso del operador sizeof reflejará el tamaño de la matriz, incluido el byte nulo. Por ejemplo:
char str[] = "hello"; printf("len=%zu\n", strlen(str)); // prints 5 printf("size=%zu\n", sizeof(str)); // prints 6Tu suposición es incorrecta. Su cadena de hecho termina con un \0 .
Contiene 5 caracteres h , e , l , l , o y el carácter 0.
Lo que genera la llamada print() "interna" es la cantidad de caracteres que se imprimieron, y eso es 5.
En C, todas las cadenas literales son realmente matrices de caracteres, que incluyen el terminador nulo.
Sin embargo, el terminador nulo no se cuenta en la longitud de una cadena (literal o no) y no se imprime. La impresión se detiene cuando se encuentra el terminador nulo.
En la función C , printf() devuelve el número de caracteres impresos, \0 es un terminador null que se usa para indicar el final de la cadena en el lenguaje c y no hay un tipo de string integrado a partir de c++ , sin embargo, el tamaño de su matriz debe ser al menos mayor que el número de char que desea almacenar.
Aquí está la referencia: cpp ref printf()
Todas las respuestas son realmente buenas, pero me gustaría agregar otro ejemplo para completar todas estas
#include <stdio.h> int main() { char a_char_array[12] = "Hello world"; printf("%s", a_char_array); printf("\n"); a_char_array[4] = 0; //0 is ASCII for null terminator printf("%s", a_char_array); printf("\n"); return 0; }Para aquellos que no quieren probar esto en gdb en línea, el resultado es:
Hola Mundo
Infierno
https://linux.die.net/man/3/printf
¿Es esto útil para entender qué hace el terminador de escape? No es un límite para una matriz de caracteres o una cadena. Es el personaje que le dirá al tipo que analiza -STOP, (imprimir) analizar hasta aquí.
PD: Y si lo analiza e imprime como una matriz de caracteres
for(i=0; i<12; i++) { printf("%c", a_char_array[i]); } printf("\n");usted obtiene:
Inframundo
donde, el espacio en blanco después de la doble l, es el terminador nulo; sin embargo, al analizar una matriz de caracteres, solo aparecerá el valor de carácter de cada byte. Si realiza otro análisis e imprime el valor int de cada byte ("%d%,char_array[i]), verá que (obtiene la representación del código ASCII-int) el espacio en blanco tiene un valor de 0.
Pero, ¿y si quisiera imprimir una cadena, diga printf ("hola") aunque descubrí que no termina con \0 siguiendo la siguiente declaración?
printf("%d", printf("hello")); Output: 5 Está usted equivocado. Esta declaración no confirma que el literal de cadena "hello" no termine con el carácter cero de terminación '\0' . Esta declaración confirmó que la función printf genera elementos de una cadena hasta que se encuentra el carácter cero final.
Cuando está utilizando un literal de cadena como en la declaración anterior, el compilador crea una matriz de caracteres con la duración de almacenamiento estático que contiene elementos del literal de cadena.
De hecho, esta expresión
printf("hello")es procesado por el compilador algo como lo siguiente
static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; printf( string_literal_hello );La acción de la función printf en esto se puede imaginar de la siguiente manera
int printf( const char *string_literal ) { int result = 0; for ( ; *string_literal != '\0'; ++string_literal ) { putchar( *string_literal ); ++result; } return result; }Para obtener la cantidad de caracteres almacenados en la cadena literal "hola", puede ejecutar el siguiente programa
#include <stdio.h> int main(void) { char literal[] = "hello"; printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) ); return 0; }La salida del programa es
The size of the literal "hello" is 6Primero debe aclarar su concepto. Como se borrará cuando trate con la matriz, el comando de impresión que está usando solo cuenta los caracteres que se colocan entre paréntesis. Es necesario en la cadena de matriz que terminará con \0
Una cadena es un vector de caracteres. Contiene la secuencia de caracteres que forman la cadena, seguida de la cadena de caracteres de terminación especial: '\ 0'
Ejemplo: char str[10] = {'H', 'e', 'l', 'l', 'o', '\0'};
Ejemplo: el siguiente vector de caracteres no es una cadena porque no termina con '\ 0'
char str[2] = {'h', 'e'};