我想在这一小段代码中插入双精度值并获取写入的返回值,但是如果我输入除数字之外的另一个字符,我希望返回的值为 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的完美描述。