C语言 如何不接收一个字符,该字符不是 scanf 中的双精度值的数字



我想在这一小段代码中插入双精度值并获取写入的返回值,但是如果我输入除数字之外的另一个字符,我希望返回的值为 0。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
int LegalInputChecker(double Move);
int main()
{
double Move;
int res;
scanf("%lf", &Move);
res = LegalInputChecker(Move);
return res;
}
int LegalInputChecker(double Move)
{
if(Move-(int)Move == 0 && (Move>0 && Move<=7))
return 1; 
else if((Move<0 || Move>7) && (Move-(int)Move == 0))
return 2; 
else if(Move==0)
return 3;  
else
return 0;
}

出于某种原因,例如,当我输入一个字母时,我不断得到返回值"3",这是什么原因?

当您输入无效数据(如

scanf("%lf", &Move);

scanf将失败并返回 0。因此,只需检查scanf的返回值:

if(scanf("%lf", &Move) != 1) //If scanf failed due to invalid input or EOF
res = 0;
else
res = LegalInputChecker(Move);

出于某种原因,例如,当我输入一个字母时,我不断得到返回值"3",这是什么原因?

当您输入一个字符时,Move将保持不变并且未初始化(因为您一开始没有初始化它)。对此值执行操作会导致未定义的行为。

那是因为你告诉scanf已经读取double(长浮点)。如果您输入任何非法字符,scanf不会在您的变量Move中存储任何内容(该变量未初始化并且可能包含随机数据,在您的情况下其内容是0)。如果你想做一个自己的检查器,你必须从输入中逐个读取字符,检查它的值和解析,然后是整个输入,如果正确(有这方面的函数,例如atoll) 或输出用户输入包含非法字符。

当然,你也可以检查scanf的返回值,它会在失败时返回0

看看这里man scanf

您的代码会产生未定义的行为。 返回值3的程序是允许的无限结果宇宙中的一个结果。

特别是,当这个...

scanf("%lf", &Move);

。甚至无法扫描一位数字,Move的值不会被修改。 但是,您尚未初始化它或以任何其他方式设置其值,因此之后访问其值会导致未定义的行为。 在这种特殊情况下,这似乎表现得好像Move已被初始化为0,但你不能依赖它或任何其他特定的表现形式。

您可以通过scanf()的返回值来检测此情况,该值指示成功匹配和分配的输入项数。 您可以像这样获得所需的结果:

int main()
{
double Move;
if (scanf("%lf", &Move) == 1) {
return LegalInputChecker(Move);
} else {
return 0;
}
}

现在编译器更新了一天,我的 gcc 编译器会自动将值初始化为 0,这也可能是原因。

但是正确答案,上面给出了@CoolGuy的完美描述。

最新更新