当我输入错误的数据类型时,为什么我的c程序不会崩溃

时间:2017-10-31 04:54:13

标签: c

我是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

4 个答案:

答案 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

换句话说,请务必检查系统函数是否存在错误,尤其是正在执行输入的错误。