簡體   English   中英

C++ 奇怪的 cin.ignore 行為

[英]C++ weird cin.ignore behaviour

我正在嘗試為我的學生構建一個示例應用程序,它應該演示如何使用 cin.getline 和 cin.ignore 輸入多個 c 字符串,但我得到了奇怪的結果。 在我下面的代碼中,有兩個注釋的 cin.ignore 語句。 如果我取消注釋第一個,那么在運行時需要按 Enter 兩次輸入第一個字符串,只輸入一次輸入第二個。 如果我取消注釋第二個,那么兩個字符串都用一個 Enter 輸入,但第二個字符串不知何故丟失了第一個字母。

#include <iostream>
using namespace std;

struct Unit{
    int uid;
    char* name=new char[50];
    char* shname=new char[10];
};

int main() {
    Unit u;
    cout << "Record number: ";
    cin >> u.uid;
    cout << "Unit name: ";
    cin.ignore();
    cin.getline(u.name,50);
    //cin.ignore();
    cout << "Unit short name: ";
    //cin.ignore();
    cin.getline(u.shname,10);
    cout << "Record number: " << u.uid << endl
         << "Unit name: " << u.name << endl
         << "Unit short name: " << u.shname << endl;
    return 0;
}

我不太明白我做錯了什么

cin.ignore()只忽略一個字符,不管它是不是空格。

我猜你想忽略直到第一個非白字符。

例如:

while (iswspace(cin.peek()))
   cin.ignore();

正如評論中所說, getline也會讀取行尾。 您需要在使用流運算符 ( >> ) 后忽略它,因為它會在行尾之前停止,第一個getline將僅讀取新行。

您需要了解為什么有時需要使用ignore() 內置格式化輸入操作( operator>>() )使用任何空格字符作為提取的分隔符。 另一方面, getline()掃描第一次出現的換行符(默認為'\\n' )的輸入,並存儲、存儲和提取所有這些字符。 它以提取換行符結束(您使用的變體也有大小限制;我建議將std::string與非成員std::getline() )。

最終效果是在格式化輸入函數之后,緩沖區中的下一個字符是一個分隔空間。 當使用標准輸入與用戶交互時,它很可能是一個換行符,導致后面的getline()立即完成。 因此,通常會提取這些空格字符,最好使用in >> std::ws而不是in.ignore()來處理其他雜散空格字符。 使用getline() ,通常不需要跳過任何字符,因為已經提取了換行符。 換句話說:注釋的ignore()最好刪除。

另外,請確保嘗試閱讀始終驗證輸入是否成功! inout 的絕大多數錯誤是由於沒有檢查(如您發布的代碼中的情況)或輸入操作之前檢查。 學會事后檢查非常重要,以至於“使代碼簡單”的論點不成立:它不是使代碼簡單,而是完全錯誤!

暫無
暫無

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

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