0

我有一个文本文件,我正在尝试使用 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");
    }
}

谢谢大家!

4

2 回答 2

3

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

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

我认为这样做可以。

于 2013-09-12T16:39:40.313 回答
0

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

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

于 2013-09-12T16:39:55.197 回答