在C中使用scanf后getchar无法正常工作
我在写这段代码:在C中使用scanf后getchar无法正常工作,c,scanf,getchar,C,Scanf,Getchar,我在写这段代码: int b; char c; scanf("%d", &b); while((c = getchar()) != EOF) { if(c >= 9 || c < 0) { printf("Invalid number!\n"); exit(0); } } intb; 字符c; scanf(“%d”和“b”); 而((c=getchar())!=EOF){ 如果(c>
int b;
char c;
scanf("%d", &b);
while((c = getchar()) != EOF) {
if(c >= 9 || c < 0) {
printf("Invalid number!\n");
exit(0);
}
}
intb;
字符c;
scanf(“%d”和“b”);
而((c=getchar())!=EOF){
如果(c>=9 | | c<0){
printf(“无效数字!\n”);
出口(0);
}
}
当我分配b
时,自动地c
等于b
。
例如,如果我对b
的输入是10
,它会自动进入if
-语句并退出代码
有人知道原因吗?发现问题并解决问题
下面列出的代码中有大量错误。
getchar()
相当于getc(stdin)
getc()的原型是:
int getc(FILE *stream);
也就是说,getchar()
返回一个整数(从unsigned char
cast)。因此,我们需要将类型从char
更改为int
,以正确接受其返回值
请注意,EOF
不是有效的无符号字符
它扩展为有符号整数
-1
if(scanf(“%d”、&b)!=1){
fprintf(stderr,“值必须是整数。\n”);
返回退出失败;
}
if (c >= 9 || c < 0)
^^____________ logically, 9 is a valid one digit number
so removing '=' from here makes more sense
如果(c>=9 | | c<0)
^^____________从逻辑上讲,9是一个有效的一位数
因此,从这里删除“=”更有意义
值得注意的是,比较器的条件和类型都应该改变。请参阅下一步
while((c=getchar())!=EOF){
if(c=='\n')//因为c=getchar()也可以是'\n'
继续;//因此,最好忽略
如果(c>='0'&&c检查scanf
的返回值,然后从那里开始getchar
返回int
。如果c
不是int
类型,则无法可靠地检查EOF。如果输入文件是文本,则c>=9
极有可能是真的。也许你的意思是如果(c>='9'| | c<'0')
这与如果(c>=9 | | c<0)
您提供了什么输入?您是否在单独的行上为scanf
和getchar
提供了输入?如果是这样,getchar
将读取scanf
留下的未读新行。而(scanf(“%d”,&b)!=1){fputs(“错误:无效的整数输入。\n”,stderr);for(int c=getchar();c!='\n'&&c!=EOF;c=getchar()){}
正确的想法:使用int c
,错误的原因:“注意EOF不是有效的字符!它扩展为-1”-->-1是有符号的char
int
的有效值,该值用于区分256个未生成的char
值和EOF
。
1
10 // --- Note: 10 are two chars for two getchars
Valid number 49 1.
Valid number 48 0.
3
Valid number 51 3.
9
Valid number 57 9.
-
Invalid number.
a
Invalid number.
<
Invalid number.
.
Invalid number.