strtok 无法按预期使用 CSV 格式的空格

strtok not working as expected with spaces in CSV format

我正在制作一个 C 程序,它需要将书籍上的数据作为输入并创建一个有序列表。数据以 CSV 格式输入。每本书的信息如下:"ISBN code", "title", "author", 3 strings.

我使用带有“,”分隔符的 strtok 将输入信息拆分为三个字符串,然后我需要将它们传递给插入函数。除非字段中有空格,否则这似乎工作正常。例如, 111111,AAA,BBB 可以正常工作,但是 111111,A AA,BBB不会。

这是我的代码:

    Book book; // previously defined struct

    char data[212];

    scanf("%s", data);


    char *field;

    field = strtok(data, ",");
    if(field != NULL) {
        strcpy(book.isbn, field);
    }
    field = strtok(NULL, ",");
    if(field != NULL) {
        strcpy(book.title, field);
    }
    field = strtok(NULL, ",");
    if(field != NULL) {
        strcpy(book.author, field);
    }

有了这个输入: 1,A,B 我得到输出 1 - A - B 来自一个应该遍历列表并打印所有字段的函数,以“-”分隔,后跟换行符。

有了这个输入: 1,A A,b 我得到以下输出:

A - b -
1 - A -

我做错了什么?

scanf%s 格式说明符读取非白色 space 字符。因此,如果输入中有 space,它将在 space.

处停止读取

尝试使用 fgets,这将读取整行文本:

fgets(data, sizeof(data), stdin);

因为此函数将在它读取的字符串中包含一个换行符,所以将 \n 添加到您的 strtok 调用的分隔符列表中:

field = strtok(NULL, ",\n");

您是在责怪 strtok(),但这不是问题所在 - 字符串在 space 处被 scanf() 截断,因此 输入 strtok() 不是你想象的那样。这就是使用调试器大有帮助的地方。

可以修改 scanf() 格式说明符以明确指定仅“\n”作为字符串分隔符,但要确保超限安全变得越来越神秘和复杂。使用更简单 fgets()

fgets( stdin, data, sizeof(data) ) ;