gets()和scanf()函数的区别,以及对清空缓冲区概念的理解

scanf()

在一个字符串中遇到空格、回车、Tab结束,不接受遇到的空格、回车、Tab控制符后面的字符输入语句,将读入的是空格、回车、tab控制符。

如果想要读取可以采用%[]输入;

书写格式:%9[^\n],表示不包含\n,输入接受任何非回车字符,结束条件要么输入字符达到9个要么输入回车,如果超过9个则后面的会被省略

scanf(" %9[^\n] ", str );

问题:看下面一段代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	char arr[10] = { 0 };
	char c = 0;
	scanf("%s", arr);
	c = getchar();
	printf("%s\n%c", arr, c);
	system("pause");
	return 0;
}
输出结果:

【现象】输完arr按回车准备输入c的时候程序直接结束,并且输出了arr,c为回车。

【解决方法】在多个输入型函数之间从在缓冲区概念,每次输入完一个函数都要清空缓冲区。具体解决方法如下:

(1)在scanf()后面再加一个没用的getchar(),用于接收回车,并丢弃。

(2)在scanf()后面加fflush(stdin);清空缓冲区。注:高等vs不适用

(3)万能法:在scanf()后面加一个

while (getchar() != '\n')
    {
        ;
    }
gets()

遇到回车结束,并吞掉回车符。下一个字符输入语句,将读入回车以后的字符。

例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	char arr[10] = { 0 };
	char c = 0;
	gets(arr);
	c = getchar();
	printf("%s\n%c", arr, c);
	system("pause");
	return 0;
}

结果:


猜你喜欢

转载自blog.csdn.net/weixin_41318405/article/details/80034895