菜鸟笔记
提升您的技术认知

scanf输入回车问题

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

运行结果: