我正在制作一个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 -
我在做什么错?
%s
的scanf
格式说明符读取非空白字符。因此,如果输入中有空格,它将在该空格处停止读取。
尝试改用fgets
,它将读取整行文本:
fgets(data, sizeof(data), stdin);
因为此函数将在读取的字符串中包含换行符,所以将\n
添加到strtok
调用的定界符列表中:
field = strtok(NULL, ",\n");
您指责strtok()
,但这不是问题-字符串在scanf()
处被空格截断,因此对strtok()
的input并不是您想像的那样。这是使用调试器的巨大帮助。
scanf()
格式说明符可以修改为仅将'\ n'明确指定为字符串定界符,但是为了使溢出安全,它变得越来越神秘和复杂。使用fgets()
更简单。
fgets( stdin, data, sizeof(data) ) ;