Estoy tratando de resolver un código para quitar una oración solo a su carácter alfa, usando el siguiente código, pero el código siempre me da un error de tiempo de ejecución (las partes comentadas son los pasos que he tomado para encontrar la solución). < br /> [Ej: Testencence debería imprimir Testsentence]

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define BUFFER_LEN 1000

#define BUFFER_INCR 15

int main(void)
{
    int buffer_length = BUFFER_LEN;
    char *pString = malloc(BUFFER_LEN);/* initial array */
    char *pTemp_start = pString;
    long long int String_len = 0;
    char *pTemp = NULL;
    int copy = 0;
    int count = 0;/*delete this after check*/

while((*pString++ = getchar()) != '\n')
{
    String_len = pString - pTemp_start;
    printf("\nThe character you inputted is: %c", *(pString+count++));
    //getchar();

    if(String_len == (buffer_length - 1))/*reserve one for newline*/
    {
        buffer_length += BUFFER_INCR;
        pTemp = realloc(pString, buffer_length);/*reallocate space for 
                                                    15 more chars.*/
        pTemp_start = pTemp - String_len;
        pString = pTemp;
        free(pTemp);
        pTemp = NULL;
        if(!pString)
        {
            printf("The space couldn't be allocated");
            return 1;
        }
    }
}



/*checks that can be done for addresses*/
//printf("\nThe length of the string is: %lld", pString - pTemp_start);
*(--pString) = '\0';
//printf("\nThe charcter at the end is: %d", *(pString + String_len - 1)); 
//printf("\nThe character at the mid is: %d", *(pString + 2));


printf("The input string is: %c", *pString);

/*code to remove spaces*/
for(int i = 0; i < (String_len + 1); i++)
{
    if((isalnum(pString[i])))
    {

        *(pString + copy++) = *(pString +i);
    }
}

*(pString + copy) = '\0';/*append the string's lost null character*/


printf("\nThe stripped string is: \n%s", pString);

return 0;


}

El código simplemente no imprime nada de lo que se ingresa.

-2
lind 20 mar. 2017 a las 14:48

2 respuestas

La mejor respuesta

Entonces tienes un conflicto en tu código entre esta línea

while((*pString++ = getchar()) != '\n')

Y líneas como las siguientes.

pTemp = realloc(pString, buffer_length);

La primera línea que he citado está incrementando la posición de pString dentro de su memoria asignada, pero la segunda está actuando como si pString todavía apunta al inicio de la misma. realloc() no funcionará a menos que pString apunte al inicio de la memoria asignada. Entonces no verifica los resultados de la llamada realloc(), asigna el nuevo bloque de memoria a pString y luego libera la memoria recién asignada. Así que definitivamente tendrás resultados inesperados.

También debe recordar que la entrada estándar está almacenada, por lo que su código esperará hasta que tenga una línea completa para leer antes de hacer nada. Y stdout también se almacena en búfer, por lo que solo se generarán líneas que terminen en \n. Entonces, probablemente quieras tener lo siguiente ...

printf("The character you inputted is: %c\n", *pString);

... o algo similar teniendo en cuenta los problemas con la forma en que está utilizando pString.

1
Chris Turner 20 mar. 2017 a las 12:07

realloc(pString,...) no agrega un bloque asignado, reemplaza el que se reasigna (en este caso, pString). Entonces pString no es (necesariamente) un puntero válido después de esa llamada. Peor aún, entonces free(pTemp), por lo que ya no tiene nada asignado.

1
Scott Hunter 20 mar. 2017 a las 11:52