C的scanf函数。如果使用宽度修饰符,例如:%5d。如何防止用户输入的任何多余数字被读入下一个%d说明符?

时间:2019-07-14 14:47:35

标签: c scanf

我希望用户键入2个数字,然后使用scanf函数将这两个数字读入2个int变量中。

int num, num2;

scanf("%5d %d", &num, &num2);
printf("num = %d\n", num);
printf("num2 = %d\n", num2);

如果用户输入的第一个数字的位数大于5,则应丢弃多余的数字。

例如:如果用户在提示符下输入以下内容

% 12345678 222<Enter>
num = 12345
num2 = 678

我想要的是:

num = 12345
num2 = 222

我已将scanf功能模式修改为以下内容:

scanf("%5d %*[0123456789] %d", &num, &num2 );

这似乎解决了问题,如果用户输入的第一个数字大于5位,但如果小于或等于5位,则此格式说明符将丢弃用户键入的第二个数字,第三个需要输入数字。

例如:如果用户在命令提示符下键入以下内容:

% 12345 222 333 <Enter>
num = 12345
num2 = 333

我想要的是:

num = 12345
num2 = 222

任何C专业人员都可以提供解决方案,谢谢。

2 个答案:

答案 0 :(得分:2)

问题是扫描集之前之前的空间以及扫描集必须匹配才能移至下一个字段。试试这个:

scanf("%5d%*[0123456789]", &num);
scanf("%d", &num2);
需要

2个scanf调用,因为如果第一个数字为5位或更少,则scanset 不匹配

(而且您必须检查两者的返回值)

答案 1 :(得分:0)

这里的目标使我感到怀疑。即使您认为输入不正确,也无视它们,这会使用户感到困惑,并最终导致复合错误。

无论如何,仅通过调用scanf就无法做到这一点。因此,您需要这样做:使用scanf以整数形式读取最多五个字符。然后getc下一个字符;如果是数字(请参见isdigit()),则将其丢弃并重复。最后,scanf第二个整数。