Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miky Gonzalez en 12 Octubre 2013, 15:16 pm



Título: [Ayuda-C] Algo falla...
Publicado por: Miky Gonzalez en 12 Octubre 2013, 15:16 pm
Dado el siguiente código:

Código
  1. char lista_instrucciones[NUM_INSTR][10] = {
  2. {"PRINT"},
  3. {"SUM"},
  4. {"EXIT"}
  5. };
  6.  
  7. char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";
  8.  
  9. void identificador_cadena(unsigned char *codigo) {
  10. unsigned short int pos_buffer = 0;
  11. char *buffer = (char *)malloc(1 * sizeof(char));
  12.  
  13. while(saber_letra(codigo[pos])) {
  14. buffer[pos_buffer] = codigo[pos];
  15. pos++;
  16. pos_buffer++;
  17. buffer = (char *)realloc(buffer, (pos_buffer + 1) * sizeof(char));
  18. }
  19.  
  20. buffer[pos_buffer] = '\0';
  21.  
  22. // Reutilizar variable pos_buffer
  23. for(pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
  24. if(!strcmp(buffer, lista_instrucciones[pos_buffer]))
  25. printf("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);
  26.  
  27. free(buffer);
  28. return;
  29. }
  30.  

Se espera que al pasar las variables codigo y codigo2 a la función identificador_cadena, esta imprima en pantalla:

Código:
Encontrado PRINT en PRINT
Encontrado EXIT en EXIT

Pero en su lugar, imprime:
Código:
Encontrado SUM en PRINT
Encontrado EXIT en PRINT
Encontrado PRINT en EXIT
Encontrado SUM en EXIT

¿Alguien podría determinar el error?, no entiendo porque esto sucede


Título: Re: [Ayuda-C] Algo falla...
Publicado por: rir3760 en 12 Octubre 2013, 17:13 pm
Lo primero a cambiar en esta declaración:
Código
  1. char lista_instrucciones[NUM_INSTR][10] = {
  2. {"PRINT"},
  3. {"SUM"},
  4. {"EXIT"}
  5. };
Es eliminar las llaves delimitando las cadenas literales ya que no son necesarias, debería ser:
Código
  1. char lista_instrucciones[NUM_INSTR][10] = {
  2. "PRINT",
  3. "SUM",
  4. "EXIT"
  5. };

Se espera que al pasar las variables codigo y codigo2 a la función identificador_cadena, esta imprima en pantalla:

Código:
Encontrado PRINT en PRINT
Encontrado EXIT en EXIT
Eso sucede si se realizan dos llamadas a la función y antes de ello la variable "global" "pos" almacena el valor cero:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define saber_letra(ch)  isalpha(ch)
  7. #define NUM_INSTR  3
  8.  
  9. char lista_instrucciones[NUM_INSTR][10] = {
  10.   "PRINT",
  11.   "SUM",
  12.   "EXIT"
  13. };
  14.  
  15. int pos;
  16.  
  17. void identificador_cadena (unsigned char *codigo);
  18.  
  19. int main (void)
  20. {
  21.   char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";
  22.  
  23.   pos = 0;
  24.   identificador_cadena (codigo);
  25.   pos = 0;
  26.   identificador_cadena (codigo2);
  27.  
  28.   return EXIT_SUCCESS;
  29. }
  30.  
  31. void identificador_cadena (unsigned char *codigo)
  32. {
  33.   unsigned short int pos_buffer = 0;
  34.   char *buffer = (char *) malloc (1 * sizeof (char) );
  35.  
  36.   while (saber_letra (codigo[pos]) ) {
  37.      buffer[pos_buffer] = codigo[pos];
  38.      pos++;
  39.      pos_buffer++;
  40.      buffer = (char *) realloc (buffer, (pos_buffer + 1) * sizeof (char) );
  41.   }
  42.   buffer[pos_buffer] = '\0';
  43.  
  44.   for (pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
  45.      if (!strcmp (buffer, lista_instrucciones[pos_buffer]) )
  46.         printf ("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);
  47.  
  48.   free (buffer);
  49.   return;
  50. }

¿Alguien podría determinar el error?, no entiendo porque esto sucede
El problema es que solo publicas un fragmento del programa y con eso no es posible determinar la causa del error. De nuevo verifica el numero de llamadas y el valor de la variable "pos" antes de ellas.

Un saludo