Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

270
Views
'\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 answers
Answer question

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!