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