Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何不接收在scanf中不是双值数字的字符。_C_Char_Double_Scanf - Fatal编程技术网

如何不接收在scanf中不是双值数字的字符。

如何不接收在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(

我希望在这段小代码中插入双值,并按编写的方式获取返回值,但如果我输入数字以外的其他字符,我希望返回值为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;

}
#包括
#包括
输入检查(双移动);
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
,但你不能依赖于那个或任何其他特定的表现

你可以发现这个骗局