C++如何輸入多行字串(含空格)
我們要實現這樣的功能:
輸入一個整數n,表示接下來要輸入n行字串,每一行字串帶有空格,按回車表示結束該行的輸入
程式1:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
cout<<s<<endl;
}
return 0;
}
cin>>s不能接受空格輸入
程式2:
#include <iostream> #include <string> using namespace std; int main() { string s; int n; cin>>n; for(int i=0;i<n;i++) { getline(cin,s); cout<<s<<endl; } return 0; }
程式2可以實現讀入帶空格的整行字串,但只輸入一行就結束了
細心的讀者可以發現,在輸入的數字下邊出現空行
這是因為輸入數字之後,敲回車,產生的換行符仍然滯留在輸入流了,接著就被getline(cin,s)給讀進去了,
此時的s=“\n”,所以在2的後邊會有一個空行
同時for迴圈中的i也自增1,所以會少讀一行
要解決這個問題,就要幹掉滯留在輸入流中的換行符
程式3:
這下就可以了#include <iostream> #include <string> using namespace std; int main() { string s; int n; cin>>n; cin.ignore(); for(int i=0;i<n;i++) { getline(cin,s); cout<<s<<endl; } return 0; }
可以用getchar()代替cin.ignore()
getchar()讀取輸入流中的一個字元,所屬標頭檔案#include<cstdio>
還可以將
string s;
getline(cin,s);
換為:
char ch[256];
gets(ch);
我們不能用scanf("%s")輸入字串,因為它碰到空格或者TAB就會停下來,可以用下述兩種方法解決這個問題:
第一種:
fgetc(fin),讀取一個開啟的檔案fin,讀取一個字元,然後返回一個int值
為什麼返回的是int而不是char呢?
因為如果檔案結束,fgetc將返回一個特殊標記EOF,它並不是一個char
如果把fgetc(fin)的返回值強制轉換為char,將無法把特殊的EOF和普通字元區分開
如果要從標準輸入讀取一個字元,可以用getchar(),它等價於fgetc(stdin)
fgetc和getchar()將讀取“下一個字元”,因此你需要知道在各種情況下,“下一個”字元是那個
如果用scanf("%d",&n)讀取整數n,則要是在輸入123後多加了一個空格,用getchar()讀取的將是這個空格
如果在123後換行,則讀取到的將是回車符“\n”
第二種:
fgets(buf,MAXN,fin)讀取完整的一行放在字元陣列buf中,其中buf的宣告為buf[MAXN]
這個函式讀取不超過MAXN-1個字元,然後在末尾添上結束符‘\n’,因此不會出現越界的情況
之所以說可以用這個函式讀取完整的一行,是因為一旦讀到回車符‘\n’,讀取工作將會停止,而這個‘\n’也會是buf字串中最後一個有效字元(再往後就是字串結束符‘\0’了)