我正在制作一个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 -
我在做什么错了?
答案 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) ) ;