如何不接收在scanf中不是双值数字的字符。
我希望在这段小代码中插入双值,并按编写的方式获取返回值,但如果我输入数字以外的其他字符,我希望返回值为0 这是我的密码:如何不接收在scanf中不是双值数字的字符。,c,char,double,scanf,C,Char,Double,Scanf,我希望在这段小代码中插入双值,并按编写的方式获取返回值,但如果我输入数字以外的其他字符,我希望返回值为0 这是我的密码: #include <stdio.h> #include <stdlib.h> int LegalInputChecker(double Move); int main() { double Move; int res; scanf("%lf", &Move); res = LegalInputChecker(
#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;
}
#包括
#包括
输入检查(双移动);
int main()
{
双动;
国际关系;
scanf(“%lf”,&Move);
res=合法输入检查器(移动);
返回res;
}
整数合法输入检查器(双移动)
{
如果在输入无效数据(如字符)时(Move-(int)Move==0&&(Move>0&&Move)
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("%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("%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("%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
已经读取了一个双精度
(longfloat)。如果您输入任何非法字符,scanf
将不会在变量Move
中存储任何内容(该变量未初始化,可能包含随机数据,在您的情况下,其内容为0
)。如果您想制作自己的检查器,则必须从输入中逐字符读取,检查其值,然后分析整个输入,如果正确的话(有用于此的函数,例如,atol
)或用户输入包含非法字符的输出
当然,您也可以检查scanf
的返回值,失败时返回0
请看这里的,这是因为您告诉
scanf
已经读取了double
(长浮点)。如果您输入任何非法字符,scanf
不会在变量Move
中存储任何内容(该变量未初始化,可能包含随机数据,在您的情况下,其内容是0
)。如果您想制作自己的检查器,必须从输入中逐字符读取,检查其值,然后分析整个输入,如果正确(有用于此的函数,例如,atol
),或者输出用户输入包含非法字符
当然,您也可以检查scanf
的返回值,失败时返回0
请看这里的,这是因为您告诉
scanf
已经读取了double
(长浮点)。如果您输入任何非法字符,scanf
不会在变量Move
中存储任何内容(该变量未初始化,可能包含随机数据,在您的情况下,其内容是0
)。如果您想制作自己的检查器,必须从输入中逐字符读取,检查其值,然后分析整个输入,如果正确(有用于此的函数,例如,atol
),或者输出用户输入包含非法字符
当然,您也可以检查scanf
的返回值,失败时返回0
请看这里的,这是因为您告诉
scanf
已经读取了double
(长浮点)。如果您输入任何非法字符,scanf
不会在变量Move
中存储任何内容(该变量未初始化,可能包含随机数据,在您的情况下,其内容是0
)。如果您想制作自己的检查器,必须从输入中逐字符读取,检查其值,然后分析整个输入,如果正确(有用于此的函数,例如,atol
),或者输出用户输入包含非法字符
当然,您也可以检查scanf
的返回值,失败时返回0
请看这里的您的代码会产生未定义的行为。返回值
3
的程序是无限范围的结果中的一个结果
特别是,当这
scanf("%lf", &Move);
…甚至无法扫描单个数字,Move
的值未被修改。但您尚未对其进行初始化或以任何其他方式设置其值,因此访问其值后会导致未定义的行为。在这种特殊情况下,这似乎表现为Move
已初始化为0
,但你不能依赖于那个或任何其他特定的表现
你可以发现这个骗局