scanf读取字符时循环异常自动输出问题咨询
scanf读取字符时循环异常自动输出问题咨询
嗨,我来帮你理清这个问题的原因和解决办法~
首先你的猜测有点偏差,不是空字符的问题,核心原因是输入缓冲区里残留的换行符在搞鬼:
当你输入一个字符比如C然后按下回车时,实际上输入到缓冲区里的是两个字符:C和\n(换行符)。第一次循环里,scanf("%c", &c)读取了C,调用CapsCheck后输出1;到了第二次循环,scanf会直接读取缓冲区里剩下的\n,而这个换行符的ASCII码是10,不在65-90的大写字母范围内,所以CapsCheck返回0,就出现了你看到的“please enter a letter: 0”的输出,紧接着又会打印下一个“please enter a letter: ”。
接下来给你几种解决这个问题的方法:
方法一:在scanf格式串前加空格(最推荐)
在%c前面加一个空格,scanf会自动跳过所有空白字符(包括换行、空格、制表符),这样就不会读取到残留的换行符了。修改后的代码如下:#include <stdio.h> #include <stdlib.h> char CapsCheck (char c) { if (c >= 65 && c<= 90 ) return 1; else return 0; } int main() { char c; while (1) { printf("please enter a letter: "); scanf(" %c",&c); // 这里的空格是关键 printf("%d\n",CapsCheck(c)); } return 0; }方法二:用getchar()吃掉换行符
在每次scanf之后,调用getchar()读取缓冲区里的换行符,不过这种方式只适合用户输入单个字符加回车的场景,如果用户输入了多个空格再回车,可能会残留其他空白字符:// 在scanf之后添加这一行 scanf("%c",&c); getchar(); // 读取并丢弃换行符方法三:用fgets读取整行输入
这种方式可以读取整行内容,然后取第一个字符,能避免缓冲区残留问题,还能处理用户输入空行的情况(需要额外判断):#include <stdio.h> #include <stdlib.h> char CapsCheck (char c) { if (c >= 65 && c<= 90 ) return 1; else return 0; } int main() { char c; char buf[100]; // 定义缓冲区存储整行输入 while (1) { printf("please enter a letter: "); fgets(buf, sizeof(buf), stdin); c = buf[0]; // 取输入的第一个字符 printf("%d\n",CapsCheck(c)); } return 0; }
备注:内容来源于stack exchange,提问作者Ahmed El-Shaer
相关产品推荐
相关产品推荐

