繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM