strtok()函数自动忽略不是我的分隔字符的数据

时间:2013-09-12 16:33:10

标签: c csv strtok

我有一个文本文件,我试图用strtok来分隔数据。文本文件如下所示。

SET,SDI,1,Test1
SET,SDI,2,Test 2
SET,SDI,3,Test Test 3
SET,SDI,4, Test 4
SET,SDI,5,Test  5

我的strtok代码一直有效,直到将空格引入第4个值(“Test x”)。即使我特意将我的分离字符定义为逗号(“,”)。 这是输出。

printf("%s, %s, %s, %s\n", values[0], values[1], values[2], values[3]);
SET, SDI, 1, Test1
SET, SDI, 2, Test
SET, SDI, 3, Test
SET, SDI, 4, Test
SET, SDI, 5, Test

有没有办法让strtok将第4个值识别为一个值,而不是在空格后丢失数据?

这是我的strtok代码:

void openfile(char *file_name){
    FILE *file;
    char line[100];
    char sep_char[] = ",";
    char* token;

    char var[20];
    char values[10][20];
    int i;


    file = fopen(file_name, "r");
    if (file != NULL) {
        while (fgets(line, 100, file) != NULL) {
            i = 0;
            token = strtok(line, sep_char);
            while (token != NULL) {
                sscanf (token, "%s", &var);
                strcpy(values[i++], var);
                token = strtok(NULL, sep_char);
            }
            printf("%s, %s, %s, %s\n", values[0], values[1], values[2], values[3]);

        }
        fclose(file);
    }
    else {
        printf("Error");
    }
}

全部谢谢!

2 个答案:

答案 0 :(得分:3)

问题在于您的sscanf语句:它会将令牌扫描到第一个空格。只需离开该行并执行

strcpy(values[i++], token);

我认为会这样做。

答案 1 :(得分:0)

这是使用scanf的常见问题。当它击中空格字符时它会停止。使用fgets读取整行,然后使用strtok。这是fgets的man page

修改:我对您的实施情况看不够。您正在使用fgets来读取该行。我同意弗洛里斯的意见。你不需要那里的scanf。您已经拥有对令牌的引用,只需将其复制到您的值数组即可。