c - 使用 scanf("%i",var) 如果用户输入一个字母或只是按回车,我会遇到问题
问题描述
我想让我的程序再次询问用户是否输入了字母或只是按下了回车键。我知道如果输入不是数字 scanf() 将返回 0,所以我一直在这样做:
int variable;
printf("Please write an integer and then press enter: \n");
if (scanf("%i",&variable)!= 1) { /* ERROR CODE */; return 1;}
return 0;
但我不想让我的程序在输入不正确时停止。所以我尝试了这个:
int variable;
do
{
printf("Please write an integer and then press enter: \n");
} while (scanf("%i",&variable) != 1);
但是程序只会开始打印“请输入一个整数,然后按回车:”而不会停止。有没有办法做到这一点?
编辑:忘记了& edit2:谢谢大家。
edit3:我一直在研究功能。这段代码是否正确?
char variable[10]; int var;
do
{
printf("Please write an integer: ");
fgets(variable,sizeof(variable),stdint);
} while( sscanf(variable,"%i",&var) != 1 );
我已经尝试过了,它可以工作,但我把它贴在这里,因为我知道我可能遗漏了一些东西。
解决方案
int variable;
do {
printf("Please write an integer and then press enter: \n");
} while (scanf("%i", &variable) != 1 && scanf("%*[^\n]") == 0);
第二个scanf
丢弃字符直到'\n'
字符。该'\n'
字符仍然存在,尽管它将scanf
在循环的下一次迭代中被第一个跳过。该代码有一些缺陷,但在大多数情况下都能正常工作。一个缺陷是,如果在没有读取字符的情况下scanf
返回,EOF
则循环将退出,但 的值variable
将是不确定的,这可能会在使用时导致未定义的行为。这个不难治。另一个是,如果用户输入超出范围的数字,则行为未定义int
。所以一种更好的方法是使用fgets
和strtol
库函数。
推荐阅读
- android - 改造 2 中永远不会发送标头参数
- google-cloud-platform - Cloud Functions IAM 角色:403 Forbidden
- java - 无法使用 mockito 存根依赖项
- javascript - javascript中的字符串是如何变成不可变的?
- firebase - Flutter Futurebuilder 数据排序仅在热重载后更新
- windows - 无法获取任务列表批处理文件以输出子字符串
- python - 在 Windows 上的 .cmd 文件中启动 Python VEnv
- python-3.x - 使用 value_counts() 创建数据帧
- java - 是对象[] $1d = { 新对象[0]; } 考虑一个二维数组?
- html - 如何在 HTML 和 CSS 中制作一个在保持居中的同时自动缩小的对话框?