在单独的.txt文件中,我有: de4 dw9 ds8 g8,7 m3,4 p2,2
下面的函数将字符串切割成数组。 数组的输出是这样的:
de4 / w9 / s8 / g8,7 / m3,4 / p2,2 /(null)
如您所见,“w9”和“s8”缺少'd'。我似乎无法弄清楚为什么。这是我的功能:
void parseFile(char ** argv)
{
FILE * textFile;
char * string;
char ** lineToken;
int i;
textFile = fopen(argv[1], "r");
lineToken = malloc(sizeof(char *) + 1);
string = malloc(sizeof(char *) + MAX_CHAR);
while(fgets(string, MAX_CHAR, textFile) != NULL)
{
lineToken[0] = strtok(string, " "); /* Put first element in lineToken[0] */
for(i = 1; string != NULL; i++)
{
lineToken = realloc(lineToken, (sizeof(char *) * (i + 1))); /* Realloc since total number of elements is unknown */
if(lineToken == NULL) /* Check to see if reallocing caused an error */
{
move(0,0);
printw("Error reallocing. Press any key to close program.");
refresh();
getch();
exit(0);
endwin();
}
lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */
system("clear");
move(0,0);
printw("%s", lineToken[i]);
refresh();
getch();
}
}
for(i = 0; lineToken[i] != NULL; i++)
{
system("clear");
move(0,0);
printw("%s", lineToken[i]);
refresh();
getch();
}
fclose(textFile);
free(string);
free(lineToken);
}
答案 0 :(得分:2)
有两个非常明显的问题:
第一个是从文件string != NULL
读取时内循环的条件。除非string
的分配最初失败,否则这种情况将始终如此。您需要检查strtok
的返回:lineToken[i - 1] != NULL
。
第二个问题是,对于您阅读的所有行,您只有一个“数组”。因此,如果文件中有多行,则覆盖从第一行读取的所有标记。
第三个问题:如果重新分配失败,您exit
该程序。但是,您在exit
调用之后的代码,并且exit
函数未返回,因此在这种情况下不会调用endwin
。