![](/img/trans.png)
[英]Why does using two getline function together, second one doesn't take the \n character?
[英]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.