![](/img/trans.png)
[英]Why is cin.ignore() ignoring the first character of my getline input?
[英]getline removes first character; removal of cin.ignore(); does not resolve
int main()
{
for (int i = 0; i < 4; ++i)
{
cout << "Please enter Employee #" << (i+1) << "'s" << " name: ";
cin.ignore();
getline(cin, employee[i].employeeName);
cout << "Please enter Employee #" << (i+1) << "'s hours worked: ";
cin >> employee[i].hoursWorked;
cout << "Please enter Employee #" << (i+1) << "'s hourly rate: ";
cin >> employee[i].hourlyRate;
cout << "Please enter Employee #" << (i+1) << "'s Federal Tax Rate: ";
cin >> employee[i].fedtaxRate;
cout << "Please enter Employee #" << (i+1) << "'s State Tax Rate: ";
cin >> employee[i].statetaxRate;
cout << endl;
}
正如標題所說,我目前有cin.ignore();
幫助接收像“Barkley, Charles”這樣的全名(它做得很好,除了它在打印時截斷了第一個字符,留下“arkley, Charles”)但是當我刪除cin.ignore();
,就像 99% 已回答的 StackOverflow 問題一樣,沒有任何反應。 事實上,情況更糟:在第二個循環中,它會將第二個循環的第二行放在第二個循環的第一行。 這只是一團糟。 哦, cin.getline
也不起作用。 我嘗試將其與cin.sync
結合使用,但沒有使用骰子。 普通的普通老香草cin >>
在第一行問題上導致相同的第二行。 我不知道該怎么辦。 我還沒有找到一篇涵蓋這個(看似)邊緣情況的 SO 文章。 謝謝您的幫助。
與許多輸入問題一樣,問題的存在是因為您混合了基於行和基於項目的輸入。
將會發生的是最終的cin >> employee[i].statetaxRate;
將使流指針立即指向其類型的最后一個有效字符之后的位置。
這很可能是行尾的換行符,因此,當您返回獲取下一個名稱(沒有cin.ignore
)時,它會將其讀作空行。
您可能認為可以通過將cin.ignore
放在循環末尾來修復它,但您可能會遇到其他問題。 具體來說,由於該表單只是跳過一個字符,因此輸入:
123<space><newline>
將簡單地跳過<space>
並且您將遇到完全相同的問題。
一個快速的解決方法是簡單地用類似的東西(在循環的末尾)讀取整行的其余部分:
{
std::string junk;
getline(cin, junk);
}
這將准備輸入流,以便您處於下一行的開頭。
另一種可能性(這是首選,因為您第一次輸入abc
它期望一個數字會讓您感到悲傷)是將所有項目作為行讀取,然后使用字符串處理將它們放入數字變量中,例如strtod()
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.