c/c++,字符,字符串,各种方式读入与对空格,回车的处理
生活随笔
收集整理的這篇文章主要介紹了
c/c++,字符,字符串,各种方式读入与对空格,回车的处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#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則不需要。
總結
以上是生活随笔為你收集整理的c/c++,字符,字符串,各种方式读入与对空格,回车的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业债和公司债有什么不同?企业债和公司债
- 下一篇: 信用卡还不上的后果 恶意透支法不能容