C中带有scanf()的空条目的默认值

C中带有scanf()的空条目的默认值,c,scanf,C,Scanf,我从一个研究站点查看了下面的C代码,想确认带有scanf(“%d”,number)的空条目的默认值是否为-1。也就是说,如果“number”是一个“空条目”,它会自动被解释为-1吗 如果空条目不理解为-1,那么下面的代码如何不运行“do”部分中的第一个if语句(增量计数器) int main(void) { int number; int max = -100000; int counter = 0; do { scanf("%d&qu

我从一个研究站点查看了下面的C代码,想确认带有scanf(“%d”,number)的空条目的默认值是否为-1。也就是说,如果“number”是一个“空条目”,它会自动被解释为-1吗

如果空条目不理解为-1,那么下面的代码如何不运行“do”部分中的第一个if语句(增量计数器)

int main(void)
{
    int number;
    int max = -100000;
    int counter = 0;

    do {
        scanf("%d",&number);
        if(number != -1)
            counter++;
            if(number > max)
                max = number;
    }
    while (number != -1);
        if(counter)
          printf("The largest number is %d \n",max);
        else
            printf("Hey, you haven't entered any number!");
    return 0;
}

scanf
没有“默认值”这样的东西。如果
scanf
失败,则不会对指向的对象进行赋值

因此,代码的思想是循环将继续,直到用户输入
-1

代码缺少对来自
scanf
的返回值的检查,即,不只是

scanf("%d",&number);
代码应该是

if (scanf("%d",&number) != 1)
{
     // Invalid input
     // Add error handling or just exit
     exit(1);
}

你说的“空条目”是什么意思?如果scanf返回1,则根据从stdin中读取的内容为
number
分配一个值。如果
scanf
不返回1,则
number
保持未初始化状态,访问它是未定义的行为。do while循环与while循环类似,唯一的区别是它在执行语句后检查条件see a,您必须检查返回值。我认为在出现错误的情况下,您不能依靠scanf将指向的对象单独保留。如果要在scanf格式字符串中进行n次转换,并且转换在mth对象上以某种方式失败,scanf可能已经执行了一些转换,对吗?返回1、
EOF
或0。如果需要区分匹配错误和物理错误,请将
scanf
的返回值指定给一个变量。我提供的上述代码已按预期工作,因此,如果您没有在控制台中输入任何内容并按enter键,它将打印“嘿,您没有输入任何数字!。但我的问题是:它是如何正确工作的?如果“empty”不等于-1,那么计数器应该在“do”块中递增。如果计数器不是零,那么“while”块应该打印“最大的数字是Max”,而不是“嘿,你还没有输入任何数字!”@blessedk如果你只按“enter”代码中没有发生任何事情
scanf
只需“吃掉”换行符并忽略它们。好吧,现在我想我明白你的意思了。这似乎有点像一个“业余”代码:)(因为我是C语言新手,我不能这么说,但如果我用我熟悉的语言做这件事,我不会相信代码不会响应某些东西),所以当我输入nothing并按enter键时,“if”块似乎根本不会运行语句根本不运行。在这种情况下,“counter”变量将不会递增。我以为“if”会运行,并想知道代码将如何处理带有不存在的“number”变量的if(number!=-1)