c/c++,字符,字符串,各种方式读入与对空格,回车的处理

 
#include
#include
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<
 } 

下面是对字符的代码

#include
using namespace std;
int main()
{
	char a,b;
	//经测试,cin读入字符,会识别空格和回车,并且会跳过回车 
	//  ceshi: 1.sd   2.s\nd   3.s d  均正确! 
//	cin>>a>>b;
//	cout<

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

测试代码:

#include
#include
#include

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

	cout<<"****";
	cout<

输入:

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

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

 

总结:

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

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

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

c/c++,字符,字符串,各种方式读入与对空格,回车的处理_第1张图片


关于gets,cin.getline,getline

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

你可能感兴趣的:(知识点)