#include<iostream>
#include<string>
using namespace std;
int main()
{
	char a[50],b[50],charr;
	//经测试,cin读入字符串,会识别空格和回车为截止,并且不会吞掉,
	//只是每次读的时候会从第一个不为空格/回车的字符开始读(因为加一个getchar不影响,加两个就影响了) 
	//  ceshi: 	1.qwe\nasd\n||
	//		    2.qwe asd\n||
	//			3.   qwe asd\n||均正确! 
	//输入:      asd\nqwe\n输出:asd**qwe**\n**
	//输入:\n\n\n\nasd qwe\n输出:asd**qwe** **
	//总结:缓冲区中,跳过了就是跳过了,getchar不会从头识别你是空格还是回车,因为你是先cin的a,然后getchar 所以比如cin读到东西了以后才能执行后面getchar语句,同时这时候缓冲区指针是cin读到的内容,所以你最开始输入多少个\n或者空格都无所谓的 
//	cin>>a;charr=getchar();cin>>b;
//	cout<<a<<"**"<<b<<"**"<<charr<<"**"<<endl;

	//经测试,getline读入字符串,读入空格,会识别回车为截止,即不读入\n但是会吞掉(跳过)他(即将\n移出缓冲区,以防下次读入的时候直接\n了)(所以上来就\n,用cin不影响但是getline就影响了) 
	//或理解成会将\n读入字符串,但是优化的时候将其换成\0,反正就是缓冲区和字符串中都没有这个\n 
	//  不带getchar的ceshi: 1.qwe\nasd  2.qwe asd  均正确!
	//带getchar的ceshi:3.qwe asd\n \n||输出:qwe asd**** **//因为getchar只是读一个字符,不会将\n跳过 
//	string s1,s2; 
//	getline(cin,s1);
//	charr=getchar();
//	getline(cin,s2);
//	cout<<s1<<"**"<<s2<<"**"<<charr<<"**"<<endl;
 
 	//经测试,scanf读入字符串,会识别空格和回车为截止,并且不会吞掉。 
	//  ceshi: 	1.qwe\nasd\n||
	//		    2.qwe asd\n||
	//			3.   qwe asd\n||均正确! 
	scanf("%s",a);/*getchar()*/scanf("%s",b);
	cout<<a<<"**"<<b<<"**"<<endl;
	return 0 ;
	
 } 

下面是对字符的代码

#include<iostream>
using namespace std;
int main()
{
	char a,b;
	//经测试,cin读入字符,会识别空格和回车,并且会跳过回车 
	//  ceshi: 1.sd   2.s\nd   3.s d  均正确! 
//	cin>>a>>b;
//	cout<<a<<"**"<<b<<"**"<<endl;
	
	//经测试,getchar读入字符,没有识别这一说了,并且不会跳过回车和空格
	//  ceshi: 1.sd   2.s\nd   3.s d  只有1正确! 
//	a=getchar();	
//	b=getchar();
//	cout<<a<<"**"<<b<<"**"<<endl;
 
 	//经测试,getchar与 scanf结果完全相同 
	scanf("%c",&a);scanf("%c",&b);
	cout<<a<<"**"<<b<<"**"<<endl;
	return 0 ;
	
 } 

scanf和cin读字符串的时候回跳过缓冲区首的所有空格回车 但是gets getline会都读进去,

测试代码:

#include<iostream>
#include<cstdio>
#include<string>

using namespace std;
int main()
{
	char a[100];
	string s;
	int n;
	cin>>n;
	gets(a);//换成scanf试试
	//scanf("%s",a); 

	cout<<"****";
	cout<<a;
	cout<<"****"<<endl;
	
//	getline(cin,s);和gets是一模一样的,,不需要试了 	
//	cout<<"****";
//	cout<<s;
//	cout<<"****"<<endl;
	return 0 ;
}

输入:

5\n||gets和scanf的结果就不一样了

    5\n|| 结果与上一行对应的结果相同

 

总结:

scanf("%s",a);//cin>>a;  会从第一个不为空格、回车的地方开始,并且遇到空格回车就结束 ,并且将空格回车留在缓冲区中(所以后面如果用gets  则需要先跟一个getchar)

gets 从缓冲区第一个字符开始读(有啥读啥),一直读到第一个回车,并且把这个回车清除出缓冲区,(或理解成读成自己的字符串,再将其改成'\0'),所以gets好人性化啊!!不会给后面的读入留下什么后遗症。

综上所述 gets读的话,你上来就敲回车,就会结束程序了,但是如果scanf读的话,一直敲回车跟没敲一样,他还在等着你读第一个字符。


关于gets,cin.getline,getline

相比gets和cin.getline(str,10005);之下,getline(cin,str)就不这么友好,他和gets,cin.getline一样怕之前残留的 '\n' 但是不友好的地方在于(也就是唯一的区别在于)并不会帮忙把后面的'\n'吞掉,所以getline之后最好加一个getchar,而gets和cin.getline则不需要。