将值从文本文件传递到数组

我的代码遇到了一些问题。

我的程序根据来自输入文件的三个波段的颜色计算阻力量,然后打印到输出文件。

示例输入文件:

红色,绿色,蓝色
绿色,灰色,黄色

示例输出文件:

欧姆电阻= 680
以千欧为单位的电阻= 1420

但是,每次运行程序时都会崩溃。 我做了一些调试,发现它有一个来自decodeString函数的yellow索引的问题,给它一个NULL值。 我已经通过将值传递给函数decodeString而不是使用指针来部分解决了这个问题,现在它似乎有效。

现在我没有得到我期望的正确输出,我不知道错误来自哪里。 我运行的代码,但目前没有给出正确的输出。 我只是不知道在哪里看。

想想有人可以帮我解决这个问题吗? 或者,如果有任何我可能做错的事情,请指出并解释为什么它出错了。 非常感谢!

注释行用于调试。

 #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; } 

所以我试着调试我的程序以找出发生了什么,这就是我得到的结果。

蓝黑
蓝色,棕色
蓝红
蓝色,橙色
蓝色,黄色
蓝绿色
蓝色,蓝色
红黑
红棕色
红,
,blackn
,brownn
,redown
,橙子
,黄色
,greenn
,bluewn
,紫色
,graywn
,美白

我看到的代码中的第一个错误是你没有从输入字符串中删除空格,你可以通过将标记分隔符字符串更改为" ," 。 您还可以通过同时删除换行符来简化代码。

限制i的范围也是谨慎的,因为任何超过3种颜色的线都会破坏数组colord[] ,这会引起你注意第二个错误,你忘了在循环中重置i ,并且这可以解释为什么你会崩溃。

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

最后,在显示kOhms时,你应该除以1000。

当你使用

 token = strtok(color, ","); 

你只拆分“,”但在文件上你还有一个空格,所以应该是

 token = strtok(color, ", "); 

或从文件中删除空格

另外对于千欧姆,我认为你在印刷品中忘记了/ 1000

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