C++連續輸入帶空格的字串
阿新 • • 發佈:2019-01-25
測試檔案
測試1
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
string s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
cout<<s<<endl;
}
return 0;
}
測試結果
顯然cin>>s
不能夠接受空格的輸入
測試2
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
string s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
getline(cin,s);
cout <<s<<endl;
}
return 0;
}
測試結果
顯然getline函式的使用比只用cin要好多了,至少能讀入帶有空格的字串,但是少了最後一行,第一行成了空行。
解釋: C++中本質上有兩種getline函式,一種在標頭檔案istream中,是istream類的成員函式。一種在標頭檔案string中,是普通函式。
在istream中的getline函式有兩種過載形式:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
作用是從istream中讀取至多n個字元儲存在s對應的陣列中。即使還沒讀夠n個字元,如果遇到換行符’\n’(第一種形式)或delim(第二種形式),則讀取終止,’\n’或delim都不會被儲存進s對應的陣列中。並且讀到‘\n’的時候會自動替換成‘\0’。所以在讀取輸入流的時候第一個“3”讀取之後緊接著讀取了‘\n’這時第一行就為空行了,這樣又會造成少讀最後一行,所以需要在之前忽略第一次讀入,改為以下程式碼。
測試3
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
string s;
int n;
cin>>n;
for(int i=-1;i<n;i++)//相比於測試2,i的初值改為了-1
{
getline(cin,s);
if(i<0)continue;//忽略第一次讀入,去到那個回車
printf("Case %d:",i+1);
cout<<s<<endl;
}
return 0;
}
測試結果
現在已經完全讀入了
而且換成gets也可以,如下
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
char s[256];//足夠大就可以
int n;
cin>>n;
for(int i=-1;i<n;i++)//相比於測試2,i的初值改為了-1
{
gets(s);
if(i<0)continue;//忽略第一次讀入,去到那個回車
printf("Case %d:",i+1);
cout<<s<<endl;
}
return 0;
}
補充說明,在C語言中直接使用scanf(“%s”)輸入字串是不行的,因為它碰到空格或者TAB就會停下來。