簡體   English   中英

為什么在不使用 getline() 時必須使用 cin.ignore?

[英]why do I have to use cin.ignore when I not using getline()?

我寫了以下代碼

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int i;
    while(true)
    {
      cout << "\nEnter an integer: ";
      cin >> i;
      if( cin.good() ) 
      {

        break; 
      }
      cin.clear();
      cout << "Incorrect input";
    }
    cout << "integer is "<< i;

    return 0;
}

但是,當我執行代碼時,它會無限地打印Enter a number: Incorrect Input在我輸入第一個輸入( nine或任何非整數)后。 我嘗試了很多東西,最后得到了一個代碼,但我不明白為什么我要在不使用getline()時使用cin.ignore() getline() 我最終得到的代碼:

#include <string>

using namespace std;

int main()
{
    int i;
    while(true)
    {
        cout << "\nEnter an integer: ";
        cin >> i;
        if( cin.good() ) 
        {
            break; 
        }
        cin.clear();
        cout << "Incorrect input";
        cin.ignore(10,'\n');    //Why this line if I am not using getline?
    }
    cout << "integer is "<< i;

    return 0;
}

據我所知,在使用getline() cin.ignore()之前我們必須使用cin.ignore() getline()原因與 cin>> 不同,它不會忽略 '\\n' 字符。 然而,我在代碼中沒有使用 getline() 所以為什么會出現錯誤。 能不能解釋一下...

基本上ignore()讀取該行的其余部分並將其刪除。 您想這樣做是因為否則您只會嘗試一次又一次地重新讀取相同的值並且總是失敗。

例子:

 Enter an integer:
 Fify Six                  <-- If I typed that.

然后這一行:

 cin >> i;                 // This will fail (as i is an int)
                           // and there is no integer value on the input.

所以你無法讀取值。 注意:這不會刪除仍在等待讀取的輸入。 因此,如果您只是清除狀態並重試,您將再次失敗,因為您試圖重復讀取相同的值(總是失敗)。

現在您可以刪除單個字符並將其扔掉,然后再試一次。 這將是嘗試並最終解決此問題的有效技術。 它會在 7 次嘗試后到達那里(每次嘗試扔掉一個角色)。

但通常你只是扔掉整條線。 這是因為std::cin被緩沖並且一次只傳遞給應用程序一行。 即,您鍵入一些文本,然后按回車鍵,此時緩沖區將刷新到您的代碼中以進行解析。 如果用戶做錯了什么,通常整行都是錯誤的,因此丟棄它只會進入下一組用戶輸入。

您應該注意到這個緩沖輸入模型也與std::cout流相關聯。 它確保當您嘗試從std::cin讀取時,輸出流會自動刷新,因此您在輸入中回答的問題與輸出中詢問的內容相匹配。 這導致用戶每行有 1 個問題和 1 個答案。 所以不正確的輸入可以簡單地一次刪除一行。

現在這並不能阻止用戶濫用系統並在一行中輸入多個答案。 當答案錯誤時,所有這些都會同時被忽略。

暫無
暫無

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

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