Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

274
Vistas
'\0' y printf() en C

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: 5

pero 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?

over 4 years ago · Santiago Trujillo
9 Respuestas
Responde la pregunta

0

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)); }

https://godbolt.org/z/wYn33e

 sizeof(string) = 6, strlen(string) = 5
over 4 years ago · Santiago Trujillo Denunciar

0

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 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 6
over 4 years ago · Santiago Trujillo Denunciar

0

Tu 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.

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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()

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

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 6
over 4 years ago · Santiago Trujillo Denunciar

0

Primero 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

over 4 years ago · Santiago Trujillo Denunciar

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'};

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda