不断出现关于同一问题的提问。我如何使用 `>>` 从 `cin` 获取用户输入到 X 类型。使用 `>>` 运算符会带来很多问题。试着输入一些无效数据,看看它是如何处理的。
`cin` 在导致输入问题方面臭名昭著,因为它不会从流中删除换行符,也不会进行类型检查。因此,任何使用
cin >> var;
并接着使用另一个
cin >> stringtype;
或
getline();
的人都会收到空输入。最佳实践是
不要混合使用 `cin` 的不同类型的输入方法。
我知道使用
cin >> integer;
比下面的代码更容易。但是,下面的代码是类型安全的,如果你输入了非整数内容,它会进行处理。上面的代码只会进入无限循环,并在你的应用程序中导致未定义的行为。
使用
cin >> stringvar;
的另一个缺点是 `cin` 不会进行长度检查,并且会在遇到空格时停止。所以,如果你输入的内容超过一个单词,只有第一个单词会被加载。空格和后面的单词仍然留在输入流中。
一个更优雅、更易于使用的解决方案是
getline();
函数。下面的示例展示了如何加载信息以及如何在类型之间进行转换。
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
|
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string input = "";
// How to get a string/sentence with spaces
cout << "Please enter a valid sentence (with spaces):\n>";
getline(cin, input);
cout << "You entered: " << input << endl << endl;
// How to get a number.
int myNumber = 0;
while (true) {
cout << "Please enter a valid number: ";
getline(cin, input);
// This code converts from string to number safely.
stringstream myStream(input);
if (myStream >> myNumber)
break;
cout << "Invalid number, please try again" << endl;
}
cout << "You entered: " << myNumber << endl << endl;
// How to get a single char.
char myChar = {0};
while (true) {
cout << "Please enter 1 char: ";
getline(cin, input);
if (input.length() == 1) {
myChar = input[0];
break;
}
cout << "Invalid character, please try again" << endl;
}
cout << "You entered: " << myChar << endl << endl;
cout << "All done. And without using the >> operator" << endl;
return 0;
}
|