La función de imprimir una cadena de texto sólo imprime hasta que encuentra un espacio.
Mi código es:
#include <stdio.h>
//#include <cstring>
#include <stdlib.h>
char *p_texto = "Prueba Raul";
char *p_texto2;
int main(){
int tamano;
printf("Pon el tamaño del string\n");
scanf("%i", &tamano);
p_texto2 = malloc(tamano);
printf("Escriba un texto\n");
scanf("%s", p_texto2);
printf("%s", p_texto2);
while(*p_texto2!='\0'){
printf("%c", *p_texto2);
p_texto2++;
}
return 0;
}
La salida es:
Pon el tamaño del string
20
Escriba un texto
Hello world
HelloHello
Me gustaría saber por qué solo imprime “Hello” y no imprime la frase completa.</stdlib.h></stdio.h>
davy.ai
El problema con el código es que
malloc()
solo asigna suficiente memoria para almacenartamano
número de caracteres, sin incluir el carácter de terminación nula\0
. Por lo tanto, cuandoscanf()
lee la cadena “Hello world”, escribe los 11 caracteres (incluyendo el carácter de terminación nula) en la memoria apuntada porp_texto2
. Sin embargo, dado que el tamaño de la memoria asignada es solo 20, los caracteres restantes en la cadena de entrada se escriben fuera de la memoria asignada, lo que resulta en un comportamiento indefinido.En este caso, parece que los caracteres adicionales se escribieron en la ubicación de memoria inmediatamente después del espacio asignado, que resultó ser donde el puntero original
p_texto
estaba apuntando. Esto hace que los caracteres adicionales se impriman cuando se ejecuta el bucle while.Para solucionar este problema, el código debería asignar suficiente memoria para almacenar toda la cadena de entrada, incluyendo el carácter de terminación nula, en lugar de solo el número de caracteres ingresados por el usuario. Una forma de hacer esto sería usar
strlen()
para determinar la longitud de la cadena de entrada antes de asignar memoria, de la siguiente manera:Este código primero lee la cadena de entrada usando
scanf()
, luego usastrlen()
para determinar la longitud de la cadena (incluyendo el carácter de terminación nula). Luego asigna suficiente memoria para almacenar toda la cadena usandomalloc()
, y finalmente copia la cadena original en la memoria recién asignada usandostrcpy()
. Esto asegura que toda la cadena de entrada (incluyendo el carácter de terminación nula) se almacene en la memoria asignada, evitando cualquier comportamiento indefinido.