#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;
}