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 respuestas
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.
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.
Preguntas relacionadas
Nuevas preguntas
c
C es un lenguaje de programación de uso general utilizado para la programación del sistema (SO e integrado), bibliotecas, juegos y multiplataforma. Esta etiqueta debe usarse con preguntas generales sobre el lenguaje C, como se define en el estándar ISO 9899 (la última versión, 9899: 2018, a menos que se especifique lo contrario; también etiquete las solicitudes específicas de la versión con c89, c99, c11, etc.). C es distinto de C ++ y no debe combinarse con la etiqueta C ++ en ausencia de una razón racional.