在getchar之后使用Scanf?

时间:2014-01-14 13:20:29

标签: c scanf getchar

我正在修C程序课程。我不明白这些代码。

#include <stdio.h>
int main()
{
    int c;
    int ival;
    printf("type : ");
    c = getchar();
    scanf("%d", &ival);
    printf("c     = %d\n", c);  //65
    printf("ival  = %d\n", ival);  //127
    return 0;
}

例如,每当我输入 Abc 时,我都会 c = 65 ; ival = 1 。 为什么ival是1?

3 个答案:

答案 0 :(得分:5)

ival永远不会被初始化,所以它可以有任何价值。原因是c正在接收'A'(通过getchar())然后scanf 失败来读取一个数字(因为下一个字符是输入'b'不是十进制数字),因此它永远不会触及ival

您可以检查scanf的返回值,看它是否失败或成功:

if (scanf("%d", &ival) != 1)
    printf("you need to enter a number\n");
else
    printf("entered: %d\n", ival);

请注意,scanf会返回成功阅读和分配的的数量。例如,如果正确读取所有三个项目,则scanf("%d %f %c", ...)将返回3. 1


1 请注意,已分配表示忽略的输入(例如具有赋值 - 抑制修饰符(*)的输入)不计朝着scanf的返回值(C11,7.21.6.2.10,16)。此外,%n不会影响scanf的返回值(C11,7.21.6.2.12)。

答案 1 :(得分:2)

使用Abc时,getchar()会显示A,因此c将保留A的字符代码,恰好在您的计算机上为65 (这是A)的ascii代码。

对于ival,您可以获得任何内容:因为%d上的scanf()期望读取一个整数,而您没有提供一个,scanf()提前返回,离开输入缓冲区中的bc,因此在您调用ival时从printf()读取的值未定义:它可以打印任何内容。

答案 2 :(得分:0)

原因是您的程序会调用未定义的行为A会在getchar读取bcscanf未读取%d {1}}期望读取一个整数,因此在遇到该字符时会立即停止读取并保持ival未初始化。