字符串输出数组,缺少字符,ncurses

时间:2014-03-14 08:44:50

标签: c arrays ncurses

在单独的.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);

}

1 个答案:

答案 0 :(得分:2)

有两个非常明显的问题:

第一个是从文件string != NULL读取时内循环的条件。除非string的分配最初失败,否则这种情况将始终如此。您需要检查strtok的返回:lineToken[i - 1] != NULL

第二个问题是,对于您阅读的所有行,您只有一个“数组”。因此,如果文件中有多行,则覆盖从第一行读取的所有标记。


第三个问题:如果重新分配失败,您exit该程序。但是,您在exit调用之后的代码,并且exit函数未返回,因此在这种情况下不会调用endwin