c - 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 专业人士都可以提供解决方案,谢谢。
解决方案
问题是扫描集之前的空间以及扫描集必须匹配才能移动到下一个字段。尝试这个:
scanf("%5d%*[0123456789]", &num);
scanf("%d", &num2);
需要 2 次 scanf 调用,因为如果第一个数字为 5 位或更少,则扫描集将不匹配。
(并且您必须检查两者的返回值)
推荐阅读
- postgresql - PostgreSQL 安装程序无法在 Windows 10 上启动
- kubernetes - 有没有办法限制与 Spacy、Torch 等共享的 vgpu 上的 per_process 内存?
- c++ - 如何设置参数以使用 clang::tooling::runToolOnCodeWithArgs 编译 MacOS 代码?
- php - 使用 PHPUnit 10 模拟类时如何最好地保留一些方法
- sql-server - 使用子查询或 CTE 进行 SQL Server 更新,需要保证竞争条件安全
- python - 如何安排 conda env 中的 python 脚本每 n 分钟运行一次?
- php - 当控制器中有进程时,Laravel 卡住了
- python - PyQt5 窗口出现空
- html - 在 Crome 上显示黑屏的 html 视频
- azure-ad-b2c - B2C 密码重置策略强制登录进入忘记密码流程