如果用户输入字母或仅按Enter时使用scanf(“%i”,var),则我遇到问题

问题描述 投票:-1回答:1

我想让我的程序再次询问用户是输入字母还是按Enter。我知道,如果输入的不是数字,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);

但是程序将立即开始打印“请输入一个整数,然后按Enter:”而不会停止。有办法吗?

编辑:忘记了&edit2:谢谢大家。

edit3:我一直在研究这些功能。此代码正确吗?

char variable[10]; int var;
do
{
printf("Please write an integer: ");
fgets(variable,sizeof(variable),stdint);
} while( sscanf(variable,"%i",&var) != 1 );

我已经尝试过并且可以正常工作,但是我将其发布在这里,因为我知道我可能丢失了一些东西。

c scanf
1个回答
0
投票
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库函数。

© www.soinside.com 2019 - 2024. All rights reserved.