if语句在C中不起作用,尽管满足条件


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int c;
while(true)
{
c = scanf("%d", &c);
if(c==12)
{
printf("goes in");
break;
}
}
    return 0;
}

我还在学C,我被困在这里了。我的代码很简单,但我不知道为什么它不起作用。while循环正常工作,但是尽管满足条件,我还是无法访问if语句。

谢谢!

scanf函数返回匹配的模式数。因此,如果您键入一个数字并按ENTER键,该数字将首先由函数存储在c中,然后它将返回值1,表示读取了1值。然后将返回值1分配给c,覆盖您输入的任何数字。

跳过分配,c将具有您输入的值。

scanf("%d", &c);
if(c==12)
{
printf("goes in");
break;
}

或者更好的是,将返回值分配给另一个变量,看看是否真的输入了一个数字。

int rval = scanf("%d", &c);
if(rval == 1 && c==12)
{
printf("goes in");
break;
}

scanf充满陷阱。(http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)。作为一个初学者,你最好完全避免它。(作为一个任何级别的程序员,避免它都是明智的!(。要稳健地执行这个简单的程序,您必须做一些事情。考虑:

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
int c, rv;
while( (rv = scanf("%3d", &c)) != EOF ){
if( rv == 0 ){
int k;
/* Consume a line of input */
while( (k = getchar()) != EOF && k != 'n' ){
;
}
} else if( c == 12 ){
printf("goes inn");
break;
}
}
return 0;
}

由于c未初始化,如果您尝试在不首先赋值的情况下读取其值,则程序的行为是未定义的。scanf可能会在不赋值的情况返回,如果您不检查scanf返回的值以确保其为1,则无法读取c的值。此外,使用%d总是受到未定义行为的影响,因为可以读取表示无法放入整数的值的字符串。通过使用%3d,我们避免了这种可能性(语言标准规定整数可以容纳-99和999之间的所有整数值(。最后,如果scanf返回0,则需要消耗数据,因为返回0表示scanf没有消耗任何数据。(这不是归零的意思,但在这种情况下确实如此。(如果您尝试在不消耗数据的情况下再次调用scanf,程序将处于旋转循环中。

作为一个初学者,最好的办法就是停止使用scanf

如前所述,您正在重新分配变量c,该变量在scanf的调用中获得其值

scanf("%d", &c);
^^^^

带有函数scanf的返回值

c = scanf("%d", &c);

根据C标准(7.21.6.4扫描功能(

3如果输入故障发生在第一次转换(如果有的话(完成之前。否则,scanf函数将返回输入项目的数量在早期匹配失败的事件。

我已经写了我的答案,因为我想建议用以下方式重写while循环

#include <stdio.h>
int main( void )
{
int c;
while ( scanf("%d", &c) == 1 )
{
if ( c == 12 )
{
printf( "goes inn" );
break;
}
}
return 0;
}

或者,由于变量c仅在while循环的主体中使用,因此最好在声明变量c的范围中使用for循环。您应该在使用变量的最小作用域中声明变量。

#include <stdio.h>
int main( void )
{
for ( int c; scanf("%d", &c) == 1; )
{
if ( c == 12 )
{
printf( "goes inn" );
break;
}
}
return 0;
}

最新更新