Desprendiendo una oración por solo sus caracteres alfa -- ampo con string campo con windows campo con pointers campo con pelles-c camp Relacionados El problema

Stripping a sentence for only it's alpha characters


-2
vote

problema

Español

Estoy tratando de resolver un código para eliminar una frase solo a su carácter alfa, utilizando 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 había tomado para descubrir la solución ).
[Ej: la evaluación de la prueba debe imprimir la prueba]

  #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()) != ' ') {     String_len = pString - pTemp_start;     printf(" The 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(" The length of the string is: %lld", pString - pTemp_start); *(--pString) = ''; //printf(" The charcter at the end is: %d", *(pString + String_len - 1));  //printf(" The 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) = '';/*append the string's lost null character*/   printf(" The stripped string is:  %s", pString);  return 0;   }   

El código simplemente no imprime nada que se ingrese.

Original en ingles

I'm trying to solve a code to strip a sentence down only to it's alpha character, using the following code, but the code always gives me a runtime error(The commented parts are steps I had taken to figure out the solution).
[Ex: Test'sen- tence should print 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;   } 

The code simply doesn't print anything that's inputted.

              

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Así que tiene un conflicto en su código entre esta línea

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

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 el segundo está actuando como si Ptring todavía está apuntando al inicio de él. realloc() no funcionará a menos que Ptring esté apuntando al inicio de la memoria asignada. Luego, no está comprobando los resultados de la llamada realloc(pString,...)3 , asignando el nuevo bloque de memoria a Ptring y luego libere la memoria recién asignada. Así que definitivamente vas a tener resultados inesperados.

También tiene que recordar que STDIN está amortiguado, por lo que su código esperará hasta que tenga una línea completa para leer antes de hacer nada. Y STdoUT también está tamponado, por lo que solo las líneas que terminan en un se emitirán. Así que probablemente desee tener lo siguiente ...

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

... o algo similar teniendo en cuenta los problemas con la forma en que está usando Ptring.

 

So you've got a conflict in your code between this line

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

and lines like the following.

pTemp = realloc(pString, buffer_length); 

The first line I've quoted is incrementing the position of pString within your allocated memory, but the second one is acting as if pString is still pointing to the start of it. realloc() won't work unless pString is pointing to the start of the allocated memory. You're then not checking the results of the realloc() call, assigning the new memory block to pString and then freeing the newly allocated memory. So you're definitely going to have unexpected results.

You also have to remember that stdin is buffered, so your code will wait until it's got an entire line to read before doing anything. And stdout is also buffered, so only lines that end in a \n will be output. So you probably want to have the following...

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

...or something similar bearing in mind the issues with how you're using pString.

 
 
1
 
vote

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

 

realloc(pString,...) does not add an allocated block, it replaces the one being reallocated (in this case, pString). So pString isn't (necessarily) a valid pointer after that call. Worse, you then free(pTemp), so you no longer have anything allocated.

 
 
 
 

Relacionados problema

-1  ¿Puede la macro se puede usar aquí?  ( Can the stringize macro be used here ) 
Uso de Pelles C Me gustaría mostrar o registrar una matriz de caracteres sin firmar. ¿Es posible usar la macro Stringizar para mostrar la matriz completa co...

-5  Identificador no declarado 'Número', ¿cómo puedo encontrar esto? [cerrado]  ( Undeclared identifier number how do i get around this ) 
cerrado. Esta pregunta es no reproducible o fue causado por tipográficos . Actualmente no está aceptando respuestas. ...

-2  Desprendiendo una oración por solo sus caracteres alfa  ( Stripping a sentence for only its alpha characters ) 
Estoy tratando de resolver un código para eliminar una frase solo a su carácter alfa, utilizando el siguiente código, pero el código siempre me da un error de...

1  Enlace a una DLL en PELLES C  ( Link to a dll in pelles c ) 
Tengo un archivo 218KB .dll y un archivo de 596kb <.so , ambos con nombres idénticos. Quiero enlazar con el .dll para evitar el error "Símbolo externo no ...

2  ¿Por qué obtengo una violación de acceso en ATIO6AXX.DLL cuando llame a GlbindBuffer? [cerrado]  ( Why do i get an access violation in atio6axx dll when calling glbindbuffer ) 
Es poco probable que esta pregunta ayude a cualquier visitante futuro; Solo es relevante para un pequeño área geográfica, u...

4  No se puede obtener la función SHGetKnownFolderPath () trabajando  ( Cannot get shgetknownfolderpath function working ) 
Estoy teniendo problemas con la función SHGETKNOWNFOLDERPATH (). Estoy recibiendo el siguiente mensaje de error: AddViewController2 En el AddViewControll...

1  El código puede dejar de funcionar con la optimización del compilador [cerrado]  ( Code can stop working with compiler optimization ) 
Es difícil decir qué se está preguntando aquí. Esta pregunta es ambigua, vaga, incompleta, demasiado amplia, o retórica y n...

-1  No se puede compilar el programa en PELLES C  ( Cannot compile program on pelles c ) 
Soy muy nuevo en la programación de C.Can, por favor, hágamelo saber dónde está mi error y por qué es así, con el programa ON (PELLES C) Dado a continuación...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos