1. 程式人生 > >C++如何輸入多行字串(含空格)

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’了)