即使最后一个参数是错误的输入,sscanf也会返回正确数量的参数

时间:2017-09-17 17:05:10

标签: c scanf

所以我有一部分代码用于从字符串中读取一些信息:

  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不是intsscanf返回4以便继续执行。

如果我插入这样的输入:

somename 123A 12a 123

工作正常。

是否有解决此问题的解决方法?谢谢你的时间:))

2 个答案:

答案 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
}
  • 如果无法解析其中一个字段,则返回值将小于4.
  • 如果最后有额外输入,%c将跳过尾随空格并成功将额外字符转换为c,返回值将为5