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

问题描述

我希望用户输入 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 专业人士都可以提供解决方案,谢谢。

标签: cscanf

解决方案


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

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

需要 2 次 scanf 调用,因为如果第一个数字为 5 位或更少,则扫描集将不匹配。

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


推荐阅读