strtok()没有打印正确的值

时间:2016-08-30 20:59:33

标签: c strtok

我正在使用C读取CSV文件,并希望将strtok()中的标记存储在数组中。不知何故,当CSV文件有多行时,我无法获得令牌的正确输出。 CSV文件看起来像这样(此示例只需两行,真实文件将有超过100行):

abc,def,ghi

jkl,mno

我的代码是:

    void main() {



    FILE *fp;
    fp = fopen("simple.csv", "r");
    const char s[2] = ",";
    char *token;
    char *out[5];
    int i = 0;
    if (fp != NULL)
    {
        char line[50];
        while (fgets(line, sizeof line, fp) != NULL)
        {
            token = strtok(line, s);

            //for (token; token != NULL; token = strtok(NULL, ","))
            while (token != NULL)
            {
                out[i++] = token;
                //printf("%s", token);
                token = strtok(NULL, s);

            }

            printf("%s\n", out[0]);

        }

        //for (i = 0; i < 5; i++)


        fclose(fp);
    }
    else {
        printf("error opening file");
    }
}

我希望每个逗号分隔的字符串都通过循环存储在数组中。 当我打印出数组的第一个元素(out[0])时,输出为:

abc

jkl

虽然我希望它只是令牌:

ABC

有谁能告诉我这是什么问题?

1 个答案:

答案 0 :(得分:1)

问题是strtok返回指向line多个地方的指针,其内容一直在变化。

因此,您需要复制令牌的内容,而不仅仅是指定指针。

例如,将out定义为:

char out[5][10];  // max of 5 words, each of 10 chars max (including \0)

并在循环内部:

strcpy(&out[i++][0], token);