• 文章
  • 使用 cin 获取用户输入。
作者:
2008 年 12 月 2 日(最后更新:2009 年 2 月 10 日)

使用 cin 获取用户输入。

评分:3.7/5(83 票)
*****
不断出现关于同一问题的提问。我如何使用 `>>` 从 `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;
}