0、问题
先从问题代码说起:
#include<stdio.h>
int main()
{
char a;
int b;
printf("输入小写字母,输出大写,输入其他字符,输出原输入字符\n");
for (b = 0; b < 5;b++)
{
scanf_s("%c", &a,1);
if (97 <= a && a <= 122)
{
printf("%c", a - 32);
}
else
printf("%c", a);
continue;
}
return 0;
}
这段代码看着貌似没啥问题,但是运行起来,应该循环5次,但是只循环3次,问题原因就在scanf这个函数上,原因如下:
1、缓冲区
输入输出都是有缓冲区的,没有将缓冲区里的内容读写完会残留在里面
2、问题原因
对于scanf来说接受%c一个字符后,回车就留在缓冲区里,等下次循环回来,就直接给了scanf一个值,所以貌似看着循环一次,但实际上已经循环了两次,露出了原形:
3、scanf特点
实际上针对%c的输入而言:%c遇到空格、回车、跳格等结束符都是会读取的。
4、解决办法
在scanf后面再加一个getchar()函数,把回车吃掉
在%c前面加个空格 如:scanf(" %c", &a);
5、正确的代码
#include<stdio.h>
int main(void)
{
char a = 0;
int b = 0;
printf("输入小写字母,输出大写,输入其他字符,输出原输入字符\n");
for (b = 0; b < 5; b++)
{
scanf("%c", &a);
getchar();
if (97 <= a && a <= 122)
{
printf("%c\n", a - 32);
}
else
{
printf("%c\n", a);
}
}
return 0;
}
运行结果: