使用 CSV 格式的空格时,strtok 无法按预期工作

Sam*_* B. 1 c string strtok

我正在制作一个 C 程序,它需要将书籍上的数据作为输入并创建一个有序列表。数据以 CSV 格式输入。每本书的信息如下:“ISBN 代码”、“书名”、“作者”、3 个字符串。

我使用带有“,”分隔符的 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);
    }
Run Code Online (Sandbox Code Playgroud)

使用此输入: 1,A,B1 - A - B 从一个函数中获取输出 ,该函数应该遍历列表并打印所有字段,以“-”分隔,后跟换行符。

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

A - b -
1 - A -
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

dbu*_*ush 5

读取非空白字符的%s格式说明scanf符。因此,如果输入中有空格,它将停止在该空格处读取。

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

fgets(data, sizeof(data), stdin);
Run Code Online (Sandbox Code Playgroud)

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

field = strtok(NULL, ",\n");
Run Code Online (Sandbox Code Playgroud)