Test Foro de elhacker.net SMF 2.1

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:

char lista_instrucciones[NUM_INSTR][10] = {
{"PRINT"},
{"SUM"},
{"EXIT"}
};

char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";

void identificador_cadena(unsigned char *codigo) {
unsigned short int pos_buffer = 0;
char *buffer = (char *)malloc(1 * sizeof(char));

while(saber_letra(codigo[pos])) {
buffer[pos_buffer] = codigo[pos];
pos++;
pos_buffer++;
buffer = (char *)realloc(buffer, (pos_buffer + 1) * sizeof(char));
}

buffer[pos_buffer] = '\0';

// Reutilizar variable pos_buffer
for(pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
if(!strcmp(buffer, lista_instrucciones[pos_buffer]))
printf("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);

free(buffer);
return;
}


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

Encontrado PRINT en PRINT
Encontrado EXIT en EXIT


Pero en su lugar, imprime:
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:
char lista_instrucciones[NUM_INSTR][10] = {
{"PRINT"},
{"SUM"},
{"EXIT"}
};

Es eliminar las llaves delimitando las cadenas literales ya que no son necesarias, debería ser:
char lista_instrucciones[NUM_INSTR][10] = {
"PRINT",
"SUM",
"EXIT"
};


Cita de: Miky Gonzalez en 12 Octubre 2013, 15:16 PMSe espera que al pasar las variables codigo y codigo2 a la función identificador_cadena, esta imprima en pantalla:

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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define saber_letra(ch)  isalpha(ch)
#define NUM_INSTR  3

char lista_instrucciones[NUM_INSTR][10] = {
   "PRINT",
   "SUM",
   "EXIT"
};

int pos;

void identificador_cadena (unsigned char *codigo);

int main (void)
{
   char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";
   
   pos = 0;
   identificador_cadena (codigo);
   pos = 0;
   identificador_cadena (codigo2);
   
   return EXIT_SUCCESS;
}

void identificador_cadena (unsigned char *codigo)
{
   unsigned short int pos_buffer = 0;
   char *buffer = (char *) malloc (1 * sizeof (char) );
   
   while (saber_letra (codigo[pos]) ) {
      buffer[pos_buffer] = codigo[pos];
      pos++;
      pos_buffer++;
      buffer = (char *) realloc (buffer, (pos_buffer + 1) * sizeof (char) );
   }
   buffer[pos_buffer] = '\0';
   
   for (pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
      if (!strcmp (buffer, lista_instrucciones[pos_buffer]) )
         printf ("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);
         
   free (buffer);
   return;
}


Cita de: Miky Gonzalez en 12 Octubre 2013, 15:16 PM¿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