cin,scanf,gets,getchar()的认识

cin,scanf,gets,getchar()是我么经常用到的几个函数,通过查阅了好多资料,接下来总结一下对这几个函数的认识和理解吧!希望对大家有点帮助。

cin>>

首先,cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。
在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。就如下面的例子:

#include<iostream>
#include<stdio.h>

using namespace std;

int main()
{
	char s;
	while(cin>>s)
	{
		cout<<s;
	}	cout<<endl;

/*	while(scanf("%c",&s)!=EOF){
		
		printf("%c",s);
	}
*/
	return 0;	
}


我输入了几个回车(enter键),然后再输入如字符时,特意输入来了空格,最后输出结果没有空白格,这就很好印证了上面所说的,cin对空白分隔符忽略并清楚。而scanf就不一样了,大家看下面scanf的介绍。

scanf()

scanf()函数是格式化输入函数,其实这个最令人恶心的地方在字符的输入上,真的给人带来了好多麻烦,还有一个就是理解其返回值,这个在多组输入上有利于大家的理解:
1、scanf()的返回值,如下:
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
如果我需要多组输入数据的话只需要用while(scanf("%c",&s)!=EOF)或者while(~scanf("%c",&s))就行了。
2、scanf()在字符输入上的难点
首先,我们要明确:
1、用户输入的字符,会以ASCII码形式存储在键盘缓冲区;
2、每调用一次scanf函数,就从键盘缓冲区读走一个字符,相当于清除缓冲区;
3、若用户一次输入n个字符,则前n次调用scanf函数都不需要用户再次输入,直到把缓冲区的数据全部读取(清除)干净;
4、调用scanf()函数时,用户最后输入的回车也会储存在键盘缓冲区
然后就是:
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
1、 遇空格、“回车”、“跳格”键
2、遇宽度结束
3、 遇非法输入
直接看代码吧:

	while(scanf("%c",&s)!=EOF){
		
		printf("%c",s);
	}

在这里插入图片描述
大家可以发现,scanf()是可以读空格并做处理的,这是和cin的一个区别

int main()
{
	char str[100];
		scanf("%s",str);
		printf("%s",str);
	
	return 0;	
} 

在这里插入图片描述
上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".遇到这种情况我解决的话,如果你要解决的话就要用到下面的gets()与getchar();

gets()

gets是C中的库函数,在< stdio.h>申明,从标准输入设备读字符串,可以无限读取,不会判断上限,以回车结束或者EOF时停止读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
这样就可以解决上述scanf()输入字符串的问题了吗,直接看代码:

int main()
{
	char str[100];
		gets(str);
		printf("%s",str);
	
	return 0;	
} 

在这里插入图片描述
这就很好的解决了上述问题,这也是gets()在输入字符串上的一个好处;

getchar()

C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符),etchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) ,相当于清除缓冲区,所以getchar()经常用于去吸收回车(用的更多)或者空格,那么我们该怎么解决上述问题呢!!直接看代码吧:

int main()
{
	char str;
		while((str = getchar())!='\n') {
		printf("%c",str);}
	
	return 0;	
} 

在这里插入图片描述直接用while((str = getchar())!=’\n’) 吸收回车就行了。
有个值得注意的点就是:
大家有人会这样认为:你从键盘输入一个字符就会输出一个字符,直到遇见了换行符呢?
其实:getchar()会从输入缓冲区去读取内容,也就是说我们把所有的内容都输入完成并且按下了Enter键后,我们的输入才被送进去了输入缓冲区,这个时候,while循环才开始工作,每一次getchar()从输入缓冲区读取一个字符,然后如果不是换行符就输出。
希望大家能够认识到这一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值