[英]why my c program doesn't crash when i entered the wrong data type
我是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
?
为什么我输入错误的数据类型时我的c程序不会崩溃
当程序的用户输入某些不能由scanf
转换为float的输入时,可变weight
将不会初始化。 因此,当程序打印变量时,它将读取未初始化的浮点数。 根据c标准,具有未定义的行为。
但是,未定义的行为不能保证程序崩溃。 它可能会崩溃或可能继续执行。 我们不知道会发生什么,因为尚不确定。 在您的系统上执行只是继续,但是在另一个系统上可能会发生程序。
在许多系统上,启动时分配给程序的内存被初始化为全零。 因此, main
变量在未初始化时通常是全零的二进制模式。 对于转换为值0.0
因此,即使您不初始化weight
它似乎也已初始化为零,并且即使输入了abc
这样的程序也可以正常运行,并将权重显示为0.0
但是,从标准的角度来看,读取未初始化的float变量仍然是未定义的行为
如果您在多次调用的函数中执行了相同的操作(之间又调用了其他函数),则迟早会看到奇怪的行为。 通常,它只是打印出奇怪的值,但是在某些系统上,您可能会看到崩溃(但这很少见)。
你应该做:
if (scanf("%f", &weight) == 1)
printf("your weight is %f kg\n", weight);
else
printf("Illegal input\n");
用户在C中提供的每个输入都被视为字符串,尽管您提供的输入是数字。 从用户那里获得输入后,使用atoi(ascii到整数)函数( man atoi )将其转换为数字数据。 该函数的返回值是转换后的值。 成功将给定的字符串转换为整数后,它将返回转换后的整数值,当结果值是非整数时则返回零。 这就是为什么当您输入其他数据时它没有显示任何错误的原因。
使用不同的格式说明符尝试相同的代码,以便您可以清楚地了解。
scanf
页 :
返回值
这些函数返回成功匹配和分配的输入项的数量,该数量可能少于所提供的数量,在早期匹配失败的情况下甚至为零。
因此, scanf
返回成功扫描的参数数量。 这就是为什么您的程序不会崩溃的原因。
程序不会崩溃,因为输入不会导致崩溃。
但是,发布的代码确实存在重大缺陷。 这行:
scanf("%f", &weight);
应该:
if( 1 != scanf("%f", &weight) )
{
perror( "scanf failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
换句话说,请始终检查系统功能是否存在错误,尤其是正在执行输入的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.