2012-08-29 66 views
9

所以我有一個函數可以跳過第一個getline並直接跳到第二個getline。我試圖清除緩衝區,但仍然沒有運氣,發生了什麼事?getline()即使在clear()後也會先跳過()

void getData(char* strA, char* strB) 
{ 
    cout << "Enter String 1: ";    // Shows this line 
    cin.clear(); 
    cin.getline(strA, 50);     // 50 is the character limit, Skipping Input 

    cout << endl << "Enter String 2: ";  // Showing This Line 
    cin.clear(); 
    cin.getline(strB, 50);     // Jumps Straight to this line 
} 
+0

是您的控制檯少於50個字符範圍內?我認爲默認是80 –

回答

10

確保您沒有使用cin >> str。在調用函數之前。如果您使用cin >> str,然後想要使用getline(cin, str),則必須先撥打cin.ignore()

string str; 
cin >> str; 
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key) 
getline(cin, str); 

在使用C字符串的情況:

char buff[50]; 
cin.get(buff, 50, ' '); 
cin.ignore(); 
cin.getline(buff, 50); 

地址:你錯了是不是可能是在功能本身,而是調用函數,而。流cin只能讀取第一個cin.getline中的新行文字\n'

0

讀完之後,bufor裏面仍然有'RETURN'字符,所以你必須在每次讀取後都要cin.ignore()。您可以使用cin.sync()來清除流。 Actualy清除方法僅清除標誌。

還有一種選擇,你可以到流的盡頭,沒有什麼可讀的,你應該寫沒有問題。

std::cin.seekg(0, std::ios::end); 

這取決於你將使用什麼。

1

cin.clear();清除流上的任何錯誤位 - 它不會消耗任何可能未決的數據。

您想要使用cin.ignore()來消耗流中的數據。

0

使用cin.ignore(-1);它不會刪除輸入字符串的第一個字符

相關問題