strtok无法以CSV格式的空格正常工作

时间:2019-11-24 16:00:14

标签: 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);
    }

使用此输入: 1,A,B 我得到了输出 1 - A - B 从应该通过列表的功能开始,并打印所有字段,并用'-'分隔,然后换行。

使用此输入: 1,A A,b 我得到以下输出:

A - b -
1 - A -

我在做什么错了?

2 个答案:

答案 0 :(得分:3)

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

尝试改用scanf,它将读取整行文本:

fgets

由于此函数将在读取的字符串中包含换行符,因此请将fgets(data, sizeof(data), stdin); 添加到\n调用的定界符列表中:

strtok

答案 1 :(得分:0)

您在责怪strtok(),但这不是问题-字符串在空格处被scanf()截断,因此对strtok() input 是不是你想像的那样。这是使用调试器会带来极大帮助的地方。

可以修改scanf()格式说明符,以仅将'\ n'明确指定为字符串定界符,但为了使溢出安全,它变得越来越神秘和复杂。使用起来更简单fgets()

fgets( stdin, data, sizeof(data) ) ;
相关问题