所以我有一部分代码用于从字符串中读取一些信息:
fgets(line, sizeof(line), stdin);
...
else if((sscanf(line, "%s %s %lf %d ", name, id, &price, &qnt ) != 4) ||
(strlen(name) > 49) ||
(strlen(id) > 4)){
...
问题在于,当我插入这样的输入时:
somename 123A 12 12a
这是错误的输入,因为12a
不是int
,sscanf
返回4以便继续执行。
如果我插入这样的输入:
somename 123A 12a 123
工作正常。
是否有解决此问题的解决方法?谢谢你的时间:))
答案 0 :(得分:1)
您收到的输出是正确的。这是sscanf()函数的标准行为。您需要了解的是scanf()是一个模式匹配函数,而不是读取多个参数的函数(尽管它也是这样做的。)
例如,
scanf("[%d][%d][%d]", &a, &b, &c)
预期输入格式为[10] [20] [30]
scanf()的工作原理是它一次读入一个字符,尝试将模式与模式匹配,并且在违反模式时,将接收到的值放在相应的变量中并放回额外的字符(违反了模式)回到输入流。
所以在你的情况下,当你输入:
somename 123A 12 12a
最后一个12a将由char处理char,当遇到a时,它会将接收到的值放到该瞬间(12)并将其放入指定的变量中。
答案 1 :(得分:1)
您可以用sscanf
这样解析字符串:
char name[50];
char id[5];
double price;
int qnt;
char c;
if (sscanf(line, "%49s%4s%lf%d %c", name, id, &price, &qnt, &c) != 4) {
// invalid input
}
%c
将跳过尾随空格并成功将额外字符转换为c
,返回值将为5
。