Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf的意外行为_C_Scanf - Fatal编程技术网

scanf的意外行为

scanf的意外行为,c,scanf,C,Scanf,我想把两个整数作为输入并输出它们的和。当输入两个整数时,代码工作正常。但是,当我为第一个值(比如2.3)输入一个非整数值并按enter键时,程序不会等待第二个输入并生成一个奇怪的输出 你能告诉我为什么会这样吗 #include <stdio.h> int main() { int a, b; scanf(" %d%d", &a, &b); int c = a +b; printf("%d\n", c); return 0;

我想把两个整数作为输入并输出它们的和。当输入两个整数时,代码工作正常。但是,当我为第一个值(比如2.3)输入一个非整数值并按enter键时,程序不会等待第二个输入并生成一个奇怪的输出

你能告诉我为什么会这样吗

#include <stdio.h>

int main()
{
    int a, b;
    scanf(" %d%d", &a, &b);

    int c = a +b;
    printf("%d\n", c);

    return 0;
}
当您给scanf一些无法解析的输入时,它不会使您的程序崩溃。相反,它在返回值中报告错误。具体来说,如果您键入2.3,scanf将能够将2读入a,但当它遇到点时将停止解析

任何未读取的变量都可能保持原来的状态。在您的情况下,b可能保持未初始化状态。读取未初始化的变量是未定义的行为,我建议用谷歌搜索它是什么。特别是,您的程序被允许崩溃、格式化硬盘驱动器,或者之后输出外观奇怪的垃圾。

使用scanf的返回值


看看scanf做了什么- 从stdin读取数据,并根据参数格式将其存储到附加参数所指向的位置

此外,scanf返回成功读取的值的数量。 通过查看scanf返回的值,可以看到哪些值被正确读取。 如果用户输入2.3或integer.integer格式的任何其他此类值,scanf将返回1。这意味着只有2个被成功读取。在您的例子中,变量a被赋值为2,而b有一些垃圾值。 当执行加法时,垃圾值被加到2

给定输入2.3,格式字符中的空格会导致跳过任何空格。如果没有空格,则第一个%d会导致读取值2。下一个要读取的字符将是,。该字符将保留在缓冲区中。scanf在处理第二个%d时将遇到“.”,认为该字符不是整数值的一部分,并终止读取,再次将“.”留在流中进行读取

因此,scanf%d%d,&a,&b的净效果是从2到a读取,而b没有变化

除非您的代码执行了读取“.”的操作(例如,使用%c格式读取),否则会发生这种情况。将继续在流中,并且%d的每次后续使用都将以相同的方式失败

您的代码没有检查scanf的返回值,但如果检查了,将检测到问题的另一个后果。然后,scanf的返回值将为1,表示成功读取了一个值a。如果已成功读取整数a和b,则将返回值2

因为b在main中是未初始化的,所以访问它的值会产生未定义的行为,scanf不会改变这一事实。未定义行为的一个可能后果是您看到的奇怪输出。

以下是手册页中关于scanf的内容

这一行:

scanf(" %d%d", &a, &b); 
应该返回2。其他任何东西都表明有问题

建议:

if( 2 != scanf( " %d %d", &a, &b ) )
{
    // handle error
}

scanf返回什么值?提示:。根据该值,您可以知道未初始化的变量是否仍保留不确定的值。scanf返回成功读取的值数。在您的情况下,当输入为2.3时,它返回1,因为只有2被正确读取。但当您以整数形式输入这两个数字时,它将返回2,因为它将正确读取这两个整数。
scanf(" %d%d", &a, &b); 
if( 2 != scanf( " %d %d", &a, &b ) )
{
    // handle error
}