什么时候应该使用
std::cin.getline()
?和std::cin
有什么区别?
让我们把
std::cin.getline()
分开。首先,有std::
。这是标准库所在的命名空间。它有数百种类型、函数和对象。
std::cin
就是这样一个物体。它是标准字符输入对象,在 <iostream>
中定义。它有自己的一些方法,但您也可以将它与许多免费功能一起使用。大多数这些方法和函数都是从标准输入中获取一个或多个字符的方法。
最后,
.getline()
是std::cin
(以及其他类似对象)的一种这样的方法。您告诉它应该从左侧的对象(此处为std::cin
)获取多少个字符,以及将这些字符放在哪里。精确的字符数可能会有所不同:.getline()
将在三种情况下停止:
1. 到达行尾
2. 输入中没有剩余字符(在 std::cin
上通常不会发生,因为您可以继续输入)
3. 读取最大字符数。
还有其他方法和函数可以与
std::cin
对象一起使用,例如
std::string s;
int i;
std::cin >> s; // Read a single word from std::cin
std::cin >> i; // Read a single number from std::cin
std::getline(std::cin, s); // Read an entire line (up to \n) from std::cin
std::cin.ignore(100); // Ignore the next 100 characters of std::cin
您阅读过任何文档吗(例如 http://www.cplusplus.com/reference/string/getline/)?
基本上,直接使用
std::cin
(或更一般地,任何std::istream
)来获取格式化输入,例如int x; std::cin >> x;
。 std::cin.getline()
仅用于填充原始 char *
缓冲区。
(很简单)我的答案是,
std :: cin.getline()
可以包含空格,而std :: cin >>
不能包含空格。
正如其他人已经回答的那样(甚至更好),粗略地说,使用
getline()
读取整行(即以 \n
结尾的字符串),使用 cin>>var
读取与 var
类型兼容的数字(整数、浮点数、双精度数等)或单个单词。
在这个答案中,我想强调混合两种方法时出现的一个问题。当你这样做时:
int a;
string s;
cin>>a;
getline(cin, s)
cin
留下行尾 \n
,然后由 getline();
读取字符。使用cin.ignore()
可以解决这个问题。
int a;
string s;
cin>>a;
cin.ignore();
getline(cin, s)
使用 std::cin >> std::ws 会跳过空格,特别是换行符,并继续读取输入实际内容的位置。