es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que malloc() solo asigna suficiente memoria para almacenar tamano número de caracteres, sin incluir el carácter de terminación nula \0. Por lo tanto, cuando scanf() lee la cadena “Hello world”, escribe los 11 caracteres (incluyendo el carácter de terminación nula) en la memoria apuntada por p_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:

    printf("Escriba un texto\n");
    scanf("%s", p_texto2);
    
    int len = strlen(p_texto2) + 1; // agregar 1 para el carácter de terminación nula
    p_texto2 = malloc(len);
    
    strcpy(p_texto2, p_texto); // copiar la cadena original en la memoria recién asignada
    

    Este código primero lee la cadena de entrada usando scanf(), luego usa strlen() para determinar la longitud de la cadena (incluyendo el carácter de terminación nula). Luego asigna suficiente memoria para almacenar toda la cadena usando malloc(), y finalmente copia la cadena original en la memoria recién asignada usando strcpy(). 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.

Comments are closed.