#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则不需要。