簡體   English   中英

getline 刪除第一個字符; 刪除 cin.ignore(); 沒有解決

[英]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.

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