簡體   English   中英

為什么 getline() 之前的 ignore() 少輸入一個字符?

[英]Why does ignore() before getline() take one less character input?

我在C++中使用了getline() function,但是出現了從第二個字符開始輸入的問題。 我使用ignore() function 首先擦除緩沖區中剩余的內容,清空緩沖區並接收輸入。 如何清空緩沖區並正確接收輸入?

圖片

以上是執行結果。 我之前使用ignore() function 和getline() function 來清空緩沖區並接收輸入,因為之前緩沖區中可能有一些剩余。

在其他這樣寫的程序中,它之前也接收到 integer 輸入。

void InputValue(string *st) {
    //cin.clear();
    cin.ignore();
    getline(cin, *st);
}

int main(void) {
    string str;
    InputValue(&str);

    cout << str;
    return 0;
}

一開始,在輸入之后, stdin (您的輸入緩沖區)立即包含:

abcd

這些角色正在等待以您選擇的任何方式提取。 由於您正在使用stdin中的getline()從標准輸入(使用std::cin )讀取到std::string ,因此getline()將消耗該行中的所有字符,讀取並丟棄尾隨'\n'和所有字符存儲在您的std::string中。 stdin中沒有剩余字符需要使用std::cin.ignore()提取

當您在getline() )之前調用std::cin.ignore()時,您正在讀取(並丟棄)等待在stdin中讀取的第一個字符。 對於上面的示例字符,在調用std::cin.ignore()並提取和丟棄字符后,以下內容留在stdin中:

bcd

所以現在當你調用getline (std::cin, *st); "bcd"是唯一可用的字符。 這就是您錯過第一個角色的原因。

雖然您可以std::cin.ignore()一個字符,但.ignore()成員 function 通常用於使用以下形式讀取/丟棄一行中的所有剩余字符

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

其中#include <limits>提供表示指定類型的最大數量的常量,在<std::streamsize>::max()之上(例如size_t可以表示的最大值)。 一個大常量用於確保該行的剩余部分,無論多長,都被消耗和丟棄,留下std::cin為空或下一行(在多行緩沖區中)的第一個字符等待讀取.

std::basic_istream::ignore也可以讀取最多一個定界符,讀取/丟棄少於整行。 這在讀取分隔的字段時很有用,或者在您將定界符與getline()一起使用以讀取少於整行的情況下。

您可以先執行讀取操作,然后調用ignore()將不需要的字符丟棄到行尾,或者您可以先使用指定數量的字符(默認1 )或分隔符調用ignore()以丟棄開頭一行的一部分,直到您想要開始閱讀的第一個字符。

正如您在上面使用的那樣,它只會截斷用戶輸入的任何內容的第一個字符——這似乎不是您想要的。 事實上,上面甚至不需要ignore() 去掉看看go丟字符的問題是不是消失了。

暫無
暫無

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

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