2017-01-31 52 views
1
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();幫助採取像「巴克利,查」全名(它做了很好的工作,但它截斷的第一個字符,留下了「arkley,查爾斯」打印時),但是當我刪除cin.ignore();,像已經回答StackOverflow的問題,99%的人說,沒有任何反應。事實上,它甚至會變得更糟:在第二循環中,將採取第二循環的第二行,並把它放在第二循環的第一道防線。這只是一團糟。哦,cin.getline也不起作用。我想,在cin.sync並沒有骰子一起。普通老式香草cin >>導致在第一線的問題同第二行。我不知道該怎麼辦。我還沒有找到涵蓋這個(貌似)邊緣案例的SO文章。謝謝您的幫助。getline刪除第一個字符;去除cin.ignore();不能解決

+0

假設'ignore'調用是在最後一次輸入之後讀取並放棄換行符,那麼將它放在循環的* end *處怎麼樣? –

+0

輝煌。謝謝老兄。 – ZoeVillanova

+0

getline不**刪除第一個字符。 **之前**的那個電話刪除了它。觸及'std :: cin'之前的唯一一個調用是對'ignore()'的調用。 –

回答

1

與許多輸入的問題,存在的問題,因爲你是混合線爲基礎,基於項目的投入。

會發生什麼是最後的cin >> employee[i].statetaxRate;將使流指針指向緊接其類型的最後一個有效字符之後的位置。

這很可能是換行符後面的換行符,所以,當您返回時獲取下一個名稱(不帶cin.ignore)時,它會將其讀取爲空行。

你可能會認爲,你可以通過將cin.ignore在循環的最後解決它,但你可以遇到其他問題這一點。具體而言,由於這種形式簡單地跳過一個字符時,輸入:

123<space><newline> 

將簡單地跳過<space>,你就會有完全一樣的問題。

速戰速決是簡單地讀的東西,如該行的所有剩餘(在循環的末尾):

{ 
    std::string junk; 
    getline(cin, junk); 
} 

等你在一開始,這將預習輸入流下一行。


另一種可能性(因爲你進入abc在那裏的期待數量將會給你帶來悲傷的第一次,這是優選)是讀取所有您的項目爲線條,然後用字符串處理把它們放入數字變量,如strtod()

相關問題