首页 > 解决方案 > 使用 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 );

我已经尝试过了,它可以工作,但我把它贴在这里,因为我知道我可能遗漏了一些东西。

标签: cscanf

解决方案


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。所以一种更好的方法是使用fgetsstrtol库函数。


推荐阅读