2017-03-15 27 views
0

所以我一直在研究從書PPP由Bjarne Stroustrup的編程和有以下分配:程序似乎忽略第二輸入線

  • 寫一個程序,你首先輸入一組名稱·和·值對, 如Joe 17和Barbara 22.對於每一對,將名稱添加到一個稱爲名稱的向量 中,並將該數字添加到稱爲分數的向量中(在相應的 位置上,以便如果名字[7] ==「喬」則得分[7] == 18)。終止 輸入行不再有(「更多」將嘗試讀取另一個 整數失敗)。檢查每個名稱是否唯一,如果名稱輸入兩次,則以錯誤 消息結束。寫出所有(名稱,分數)對,每行一個 。
  • 修改練習19中的程序,這樣當你輸入一個名字 時,程序將輸出相應的分數或「找不到名字」。
  • 修改練習19中的程序,這樣當你輸入一個整數時,程序將輸出帶有該分數或「找不到分數」的所有名字。 所以這是我寫的代碼:

    using namespace std; 
    
    int main() { 
        vector <string> names; 
        string name; 
        vector <int> scores; 
        int score; 
        string finish = "no more"; 
        cout << "Please write a player's name and the player's score: \n"; 
        while (name != "|") { 
         cin >> name; 
         cin >> score; 
         names.push_back(name); 
         scores.push_back(score); 
         cin.ignore(); 
        }  
        for (size_t j = 0; j < scores.size(); j++) { 
        for (size_t p = 0; p < scores.size(); p++) { 
         if (names[j] == names[p] && j != p) { 
          cout << "Error! You have reiterated the name: " << names[j] << "\n"; 
          system("pause"); 
          return 1; 
          } 
         } 
        } 
        cout << "Please insert a name to see it's score:\n"; 
        string s = " "; 
        cin >> s; 
         for (size_t d = 0; d < scores.size(); d++) { 
          if (s == names[d]) { 
           cout << names[d] << "'s score is: " << scores[d] << "\n"; 
          } 
        } 
        system("pause"); 
    } 
    
  • 現在我的問題很簡單,我相信。在第二個cin(cin >> s)編譯器似乎跳過這一行並終止程序,而不是讓我寫輸入。我在網上看到,這是因爲你不能使用cin兩次,所以當我添加行cin.ignore(),希望問題會解決,它並沒有幫助解決問題。有關如何解決此問題的任何提示?

    +1

    這不是編譯器忽略行,而是程序。標題因此具有誤導性。 – riodoro1

    +0

    @ riodoro1注意到並修復:) –

    +0

    你的名字裏有空格嗎? – NathanOliver

    回答

    -1

    這裏發生的是,當你按下輸入字符'\ n'仍然在流中。所以你需要刷新cin才能夠繼續。這樣做使用

    std::cin.clear(); 
    std::cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    

    在每次調用cin之後。該numeric_limits<streamsize>::max可與頭部#include <limits>

    +0

    'operator >>'ingnores白色空間,其中'\ n'被認爲是。 – NathanOliver

    +0

    謝謝,我不知道。爲什麼代碼使用我提供的代碼片段呢? – DatCorno

    +0

    現在好了,添加這些行後,當我告訴它時,它根本不會執行任何操作。它只是執行「\ n」而不是執行代碼。 –

    2

    我認爲問題是,當你使用cin >> score並輸入的東西是不是一個整數,在cin流的錯誤標誌設置使用,以及未來操作失敗。在閱讀更多輸入之前,您需要用cin.clear()清除此錯誤。

    您的學生名稱循環也是錯誤的。你永遠不會檢查「沒有更多」的名字。你檢查「|」作爲名稱,但直到完成處理輸入爲止。正如說明所述,使用no more作爲輸入的目的是使cin >> score將失敗,因爲more不是數字。

    取而代之,請使用while (cin >> name >> score)一次性讀取姓名和分數。當你輸入一個無效的分數時,這將失敗,循環結束。

    using namespace std; 
    
    int main() { 
        vector <string> names; 
        string name; 
        vector <int> scores; 
        int score; 
        cout << "Please write a player's name and the player's score: \n"; 
        while (cin >> name >> score) { 
         names.push_back(name); 
         scores.push_back(score); 
         cin.ignore(); 
        }  
        cin.clear(); // Clear error flag from above 
        for (size_t j = 0; j < scores.size(); j++) { 
         for (size_t p = 0; p < scores.size(); p++) { 
          if (names[j] == names[p] && j != p) { 
           cout << "Error! You have reiterated the name: " << names[j] << "\n"; 
           system("pause"); 
           return 1; 
          } 
         } 
        } 
        cout << "Please insert a name to see it's score:\n"; 
        cin >> s; 
        for (size_t d = 0; d < scores.size(); d++) { 
         if (s == names[d]) { 
          cout << names[d] << "'s score is: " << scores[d] << "\n"; 
         } 
        } 
        system("pause"); 
    } 
    
    +0

    謝謝你的幫助! –