【问题标题】:strtok() function automatically ignores data that isn't my separation characterstrtok() 函数自动忽略不是我的分隔符的数据
【发布时间】:2013-09-12 16:33:09
【问题描述】:

我有一个文本文件,我正在尝试使用 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 代码一直有效,直到将空格引入第四个值(“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");
    }
}

谢谢大家!

【问题讨论】:

    标签: c csv strtok


    【解决方案1】:

    问题在于您的sscanf 语句:它将令牌扫描到第一个空格。把那条线去掉就行了

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

    我认为这样就可以了。

    【讨论】:

      【解决方案2】:

      这是使用 scanf 的常见问题。当它碰到一个空白字符时它会停止。使用 fgets 读取整行,然后在其上使用 strtok。这是 fgets 的man page

      编辑:我没有仔细研究您的实施。您正在使用 fgets 来读取该行。我同意弗洛里斯的观点。你不需要 scanf 在那里。您已经拥有对令牌的引用,只需将其复制到您的值数组即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2020-12-30
        相关资源
        最近更新 更多