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