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

问题描述 投票:1回答:2

我正在制作一个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 -

我在做什么错?

c string strtok
2个回答
1
投票

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

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

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

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

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

0
投票

您指责strtok(),但这不是问题-字符串在scanf()处被空格截断,因此对strtok()input并不是您想像的那样。这是使用调试器的巨大帮助。

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

fgets( stdin, data, sizeof(data) ) ;
© www.soinside.com 2019 - 2024. All rights reserved.