1. 程式人生 > >C++連續輸入帶空格的字串

C++連續輸入帶空格的字串

測試檔案
測試

測試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; }

測試結果
測試結果1
顯然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; }

測試結果
測試2
顯然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;
}

測試結果
測試3
現在已經完全讀入了
而且換成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就會停下來。