Paso de valores del archivo de texto a la matriz

Estoy teniendo algunos problemas con mi código.

Mi progtwig calcula la cantidad de resistencia en función del color de las tres bandas provenientes de un archivo de entrada, y luego imprime en un archivo de salida.

Ejemplo de archivo de entrada:

rojo verde azul
verde, gris, amarillo

Ejemplo de archivo de salida:

Resistencia en ohmios = 680
Resistencia en kilo-ohmios = 1420

Sin embargo, cada vez que ejecuto el progtwig se bloquea. He hecho un poco de depuración y he encontrado que tiene un problema con el índice yellow de la función decodeString que le da un valor NULL . He solucionado parcialmente ese problema al pasar los valores a la función decodeString lugar de usar punteros y ahora parece que funciona.

En este momento no obtengo la salida correcta que estoy esperando y no sé de dónde viene el error. El código que tengo se ejecuta, pero no da la salida correcta en este momento. Simplemente ya no sé dónde mirar.

¿Crees que alguien puede ayudarme a arreglar esto? O si hay algo que podría haber hecho mal, indíquelo y explique por qué salió mal. Eso será muy apreciado!

Las líneas comentadas se utilizaron para la depuración.

 #include #include #include #include #define size 100 int DecodeString(char inputString[]){ const char kColorTable[10][10] = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "gray", "white"}; int i; for(i=0; i>%s,%s",inputString,kColorTable[i]); if(strcmp(inputString, kColorTable[i]) == 0){ return i; } } return -1; } int main(){ int i=0, colord[3]={0,0,0}; char color[size], *token, *inputString; double resistance=0, value; FILE *fptrin, *fptrout; if(((fptrin = fopen("input.txt", "r"))==NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){ printf("Error 404: File not found"); exit(1); } while(fgets(color, size, fptrin)!=NULL){ token = strtok(color, ","); while(token != NULL){ if(token[strlen(token)-1]=='\n') token[strlen(token)-1]='\0'; colord[i] = DecodeString(token); //printf(">>%s:%d ",token,colord[i]); i++; token = strtok(NULL, ","); puts(""); } //printf(""); if (colord[0] == -1 || colord[1] == -1 || colord[2] == -1){ printf("\n\nBad code -- cannot compute resistance\n"); } else{ resistance = (10.0 * colord[0] + colord[1]) * pow(10.0, colord[2]); } printf("%f",resistance); if(resistance > 1000){ fprintf(fptrout,"Resistance in Kilo-Ohms: %f",resistance); } else{ fprintf(fptrout,"Resistance in Ohms: %f",resistance); } } //fclose(fptrin); //fclose(fptrout); getchar(); return 0; } 

Así que traté de depurar mi progtwig para averiguar qué está pasando y este es el resultado que obtengo.

azul negro
azul Marrón
azul rojo
azul, naranja
azul amarillo
azul verde
azul Azul
negro rojo
rojo marrón
rojo rojo
ennegrecer
Brownn
redistribuir
,naranja
,amarillo
verde
azul
,Violeta
grisáceo
,blanquear

El primer error en el código que veo es que no está eliminando los espacios de la cadena de entrada, lo que puede hacer cambiando la cadena del separador de token a " ," . También puede simplificar un poco el código eliminando la nueva línea al mismo tiempo.

También es prudente limitar el rango de i ya que cualquier línea con más de 3 colores romperá la matriz colord[] , y esto le habría llamado la atención sobre el segundo error, que se olvidó de reiniciar i dentro del bucle, y Esto podría explicar por qué estás teniendo accidentes.

 while(fgets(color, size, fptrin) != NULL) { i = 0; // reset `i` token = strtok(color, " ,\n"); // test for space and newline while(token != NULL && i < 3) { // test `i` too colord[i] = DecodeString(token); i++; token = strtok(NULL, " ,\n"); // test for space and newline } } 

Finalmente debes dividir por 1000 al mostrar kOhms.

Cuando usas

 token = strtok(color, ","); 

solo se divide en “,” pero en el archivo también tiene un espacio detrás, por lo que probablemente debería estar

 token = strtok(color, ", "); 

o eliminar los espacios del archivo

También para los kilo-ohmios, creo que olvidó un / 1000 en la impresión.

 if(resistance > 1000){ fprintf(fptrout,"Resistance in Kilo-Ohms: %f",resistance/1000); }