我是c的新手,我正在编写一个要求用户输入的基本程序
#include <stdio.h>
int main(void){
float weight;
printf("enter your weight in kg:\n");
fflush(stdout);
scanf("%f", &weight);
printf("your weight is %f kg\n", weight);
return 0;
}
当我要求输入数字时,一切都按预期工作。但是当我不小心输入文字时,程序并没有崩溃,而是打印出your weight is 0.00000 kg
。
我只是想知道,为什么我的程序在遇到数字时会崩溃,但是我输入了单词?为什么打印出0.00000
?
答案 0 :(得分:3)
当我输入错误的数据类型时,为什么我的c程序不会崩溃
当程序的用户输入一些无法由scanf
转换为浮点数的输入时,变量weight
将不会被初始化。因此,当程序打印变量时,它将读取未初始化的浮点数。根据c标准,这有不明确的行为。
但是,未定义的行为不保证程序崩溃。它可能会崩溃或可能继续执行。我们无法知道,因为未定义会发生什么。在您的系统执行上只是继续,但在另一个系统上可能会发生程序。
在许多系统上,作为启动分配给程序的内存初始化为全零。因此,main
中的变量(通常)是未初始化时的全零二进制模式。对于转换为值0.0
因此,即使您没有初始化weight
,它似乎已初始化为零,即使使用abc
等输入也可以正常运行,并将权重打印为0.0
< / p>
但是,从标准的角度来看,读取未初始化的浮点变量仍然是未定义的行为
如果你在一个你多次调用过的函数中做了同样的事情(中间有其他函数调用),你迟早会看到奇怪的行为。 通常只是打印一些奇怪的值,但在某些系统上,您可能会看到崩溃(但这种情况更为罕见)。
你应该这样做:
if (scanf("%f", &weight) == 1)
printf("your weight is %f kg\n", weight);
else
printf("Illegal input\n");
答案 1 :(得分:2)
用户在C中输入的每个输入都被视为字符串,但您提供的输入是数字。在从用户获得输入后,使用atoi(ascii到整数)函数(man atoi)将其转换为数字数据。此函数的返回值是转换后的值。成功将给定字符串转换为整数后,它将返回转换后的整数值,并在结果值为非整数时返回零。这就是输入不同数据时没有显示任何错误的原因。
尝试使用不同格式说明符的相同代码,以便您可以清楚地理解。
答案 2 :(得分:1)
scanf
的{{3}}:
返回值
这些函数返回成功匹配的输入项数 和分配,可以少于提供,甚至零 早期匹配失败的事件。
因此,scanf
返回成功扫描的参数数量。这就是你的程序没有崩溃的原因。
答案 3 :(得分:1)
程序不会崩溃,因为输入不会导致崩溃。
但是,发布的代码确实存在重大缺陷。这一行:
scanf("%f", &weight);
应该是:
if( 1 != scanf("%f", &weight) )
{
perror( "scanf failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
换句话说,请务必检查系统函数是否存在错误,尤其是正在执行输入的错误。