簡體   English   中英

cin.getline()正在跳過C ++中的輸入

[英]cin.getline() is skipping an input in C++

如果我使用下面的代碼,getline不會接受最后一個輸入(對於“for”循環的最后一次迭代,它只是跳過它) -

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c); // here it skips the input for last iteration
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}

為了擺脫它,我在getline之后放了cin.ignore()。 現在它采取了所有的投入,但我正面臨一個新的問題 -

#include<iostream>
#include<string>
#include<map>
#include<set>
#include<sstream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c);
            cin.ignore();
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}

新問題是,在獲取c2時,字符串的第一個字符將被刪除。 例如,如果我將“England Jane Doe”作為getline的輸入,那么在c2中我將獲得“ngland”。

現在如何擺脫這個問題?

這個:

cin>>n;

只讀數字。
它在流上留下尾隨'\\n'

所以你第一次調用getline()就是讀一個只包含'\\n'的空行

最好不要混合使用operator>>std::getline() 你必須非常小心是否在流上留下了換行符。 我發現最容易從用戶那里一次讀取一行。 然后分別解析該行。

 std::string  numnber;
 std::getline(std::cin, number);

 int n;
 std::stringstream numberline(number);
 numberline >> n;

你的cin.ignore()在錯誤的地方。 getline不會留下尾隨\\n換行符,它是>>符號。

你可能想要的是什么

cin>>n;
cin.ignore();

寫吧

cin.ignore();

在你的最后一個“>>”運算符之后。 “>>”運算符在輸入比特流中留下換行符“\\ n”,需要在輸入之前將其清零。

實際上,cin緩沖區已經從最后一個cin開始了,所以getline取這個\\ n字符並終止; 在getline之前忽略緩沖區的內容......

cin.ignore();

getling(cin,string_name);

//它會順利運作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM