elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda-C] Algo falla...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda-C] Algo falla...  (Leído 1,977 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
[Ayuda-C] Algo falla...
« 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


En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda-C] Algo falla...
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines