En un curso introductorio de C, aprendí que mientras se almacenan las cadenas se almacenan con caracteres nulos \0
al final. Pero, ¿y si quisiera imprimir una cadena? Digamos printf("hello")
que he descubierto que no termina con la \0
siguiente declaración
printf("%d", printf("hello"));
Output: 5
pero esto parece ser inconsistente, hasta donde sé que variables como cadenas se almacenan en la memoria principal y supongo que al imprimir algo también podría almacenarse en la memoria principal, entonces ¿por qué la diferencia?
);
, ¿qué piensa mostrar con ese código? ¿Cómo has demostrado que no termina con un\0
?Respuestas:
El 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
printf
. Básicamente, el byte nulo le dice a las funciones que realizan la manipulación de cadenas cuándo detenerse.Donde verá una diferencia es si crea una
char
matriz inicializada con una cadena. El uso delsizeof
operador reflejará el tamaño de la matriz, incluido el byte nulo. Por ejemplo:fuente
printf()
. TBH No tengo idea de cómoprintf()
funciona.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 hacia la longitud de la cuerdahttps://godbolt.org/z/wYn33e
fuente
Tu suposición es incorrecta. Su cadena de hecho termina con a
\0
.Contiene de 5 caracteres
h
,e
,l
,l
,o
y el carácter 0.Lo que
print()
genera la llamada "interna" es el número de caracteres que se imprimieron, y eso es 5.fuente
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.
fuente
printf
saldría de los límites de la cadena e imprimiría caracteres "aleatorios" o "basura", y devolvería un número diferente de la longitud de la cadena. Si ya conoce la longitud de la cadena, también puede verificar si el carácter en ese índice es'\0'
, lo que funcionará pero es un comportamiento técnicamente indefinido si el tamaño de la matriz no incluye el terminador (como enchar arr[5] = "hello";
, que no agregará el terminador de la matriz).char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }
y ver cómo se ejecuta: muestra líneas con índices y el contenido en esa línea. Después del índice 4, encuentra el carácter 0 y rompe el bucle while. Ahí ves que hay un carácter 0.Todas las respuestas son realmente buenas, pero me gustaría agregar otro ejemplo para completar todas estas
Para aquellos que no quieren probar esto en gdb en línea, el resultado es:
https://linux.die.net/man/3/printf
¿Es útil 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 analizas e imprimes como una matriz de caracteres
usted obtiene:
donde, el espacio en blanco después del doble l, es el terminador nulo, sin embargo, al analizar una matriz de caracteres, solo se mostrará el valor de caracteres 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 ASCII code-int) el espacio en blanco tiene un valor de 0.
fuente
En la
C
funciónprintf()
devuelve el número de caracteres impresos,\0
es unnull
terminador que se usa para indicar el final de la cadena en lenguaje c y no hay ningúnstring
tipo incorporado a partir dec++
, sin embargo, el tamaño de su matriz debe ser al menos mayor que el númerochar
que desea Almacenar.Aquí está la referencia: cpp ref printf ()
fuente
Está usted equivocado. Esta declaración no confirma que el literal de cadena
"hello"
no termine con el carácter de terminación cero'\0'
. Esta declaración confirmó que la funciónprintf
genera elementos de una cadena hasta que se encuentra el carácter cero final.Cuando usa un literal de cadena como en la declaración anterior, el compilador crea una matriz de caracteres con la duración del almacenamiento estático que contiene elementos del literal de cadena.
De hecho, esta expresión
es procesado por el compilador algo como lo siguiente
La acción de la función printf en esto se puede imaginar de la siguiente manera
Para obtener el número de caracteres almacenados en la cadena literal "hola", puede ejecutar el siguiente programa
La salida del programa es
fuente
Primero debe borrar su concepto. Como se borrará cuando trabaje con la matriz, el comando de impresión que está usando solo cuenta los caracteres que se colocan dentro de la parálisis. Es necesario en la cadena de matriz que terminará con \ 0
fuente
Una cadena es un vector de caracteres. Contiene la secuencia de caracteres que forman la cadena, seguida de la cadena especial de caracteres finales: '\ 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'};
fuente