2012-08-29 37 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);它不会删除输入字符串的第一个字符

相关问题