[Ayuda-C] Algo falla...

Iniciado por Miky Gonzalez, 12 Octubre 2013, 15:16 PM

0 Miembros y 1 Visitante están viendo este tema.

Miky Gonzalez

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
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

rir3760

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
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