Need help with getline()
为什么在我的程序中要求用户输入,并且这样做呢?
1 2 3 4 5 6 7 8 9 10 | int number; string str; int accountNumber; cout <<"Enter number:"; cin >> number; cout <<"Enter name:"; getline(cin, str); cout <<"Enter account number:"; cin >> accountNumber; |
为什么在输入第一个数字后,它输出"输入名称",然后立即输出"输入帐号",甚至在我为getline(cin,str)行输入我的" str"之前? 谢谢!
1 2 3 4 5 6 | cout <<"Enter number:"; cin >> number; cout <<"Enter name:"; ws(cin); getline(cin, str); ... |
请注意,这也会跳过换行符后的前导空格,因此即使用户输入了
尝试
1 2 3 | cout <<"Enter name:"; cin.ignore(); getline(cin, str); |
看起来您想要基于行的阅读。为此,您可能需要一致地使用
这样,您不必手动扫描每行的末尾以确保下一个读取操作在新行上开始。
它还使为重复输入请求添加错误处理变得更加简单。
例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <string> #include <iostream> #include <istream> #include <ostream> #include <sstream> int parse_integer(const std::string& input) { std::istringstream iss(input); int result; if (!(iss >> result)) { // error - throw something? } return result; } int main() { int number; std::string str; int accountNumber; std::string inputline; std::cout <<"Enter number:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } number = parse_integer(inputline); std::cout <<"Enter name:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } str = inputline; std::cout <<"Enter account number:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } accountNumber = parse_integer(inputline); return 0; } |
我认为问题是
)
您可以使用虚拟
');
1 | cin >> number |
只从缓冲区中获取数字,它将"输入"留在缓冲区中,然后立即被getline捕获,并解释为空字符串(或只包含换行符的字符串,我忘了)。
1 2 | cin >> number // eat the numeric characters getline(cin, str) // eat the remaining newline |
不要使用