代码之家  ›  专栏  ›  技术社区  ›  Thor

为什么我的c程序在输入错误的数据类型时没有崩溃

c
  •  0
  • Thor  · 技术社区  · 8 年前

    我是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 回复  |  直到 8 年前
        1
  •  3
  •   4386427    8 年前

    为什么我的c程序在输入错误的数据类型时没有崩溃

    当您的程序用户输入的某些输入无法通过 scanf 对于浮点,变量 weight 将不会初始化。因此,当程序打印变量时,它将读取未初始化的浮点。根据c标准,这具有未定义的行为。

    然而,未定义的行为确实如此 保证程序崩溃。它可能崩溃或继续执行。我们不知道会发生什么,因为它是不确定的。在您的系统上继续执行,但在另一个系统上可能会发生程序。

    在许多系统上,在启动时分配给程序的内存被初始化为全零。因此,变量 main 未初始化时(通常)是全零二进制模式。对于转换为值的浮点 0.0

    所以即使你没有初始化 重量 似乎它被初始化为零,即使输入如下,您的程序也可以正常运行 abc 并将重量打印为 0

    然而,从标准的角度来看,读取未初始化的浮点变量仍然是未定义的行为

    如果在多次调用的函数内执行相同的操作(其间还有其他函数调用),迟早会看到奇怪的行为。 通常只是奇怪值的打印,但在某些系统上,您可能会看到崩溃(但这种情况更为罕见)。

    if (scanf("%f", &weight) == 1)
        printf("your weight is %f kg\n", weight);
    else
        printf("Illegal input\n");
    
        2
  •  2
  •   surendra nath    8 年前

    用户在C中提供的每个输入都被视为字符串,尽管您提供的输入是数字。从用户获得输入后,使用atoi(ascii到整数)函数将其转换为数字数据( man atoi ). 此函数的返回值是转换后的值。成功将给定字符串转换为整数后,返回转换后的整数值,当结果值为非整数时,返回零。这就是为什么当您输入不同的数据时,它没有显示任何错误的原因。

    使用不同的格式说明符尝试相同的代码,以便您能够清楚地理解。

        3
  •  1
  •   msc    8 年前

    这个 MAN page 属于 scanf :

    返回值

    和赋值,可以小于规定值,甚至为零 早期匹配失败的事件。

    所以 返回成功扫描的参数数。这就是为什么你的程序没有崩溃。

        4
  •  1
  •   user3629249    8 年前

    程序不会崩溃,因为输入不会导致崩溃。

    scanf("%f", &weight);
    

    应该是:

    if( 1 != scanf("%f", &weight) )
    {
        perror( "scanf failed" );
        exit( EXIT_FAILURE );
    }
    
    // implied else, scanf successful
    

    换句话说,始终检查系统功能是否存在错误,尤其是那些正在执行输入的功能。