std::getline()
应该在程序的期望输入来自交互式终端时使用。
这就是std::getline()
所做的:它读取文本直到换行符。 operator>>
不这样做,这就是std::getline()
所做的,这就是应该用来处理一行输入文本的内容。使用正确的工具,做正确的工作。
可悲的是,许多C++书籍和教程介绍>>
太早,引入std::getline()
之前,并在他们的例子使用它,只是因为它更简单,更方便的>>
处理所需要的数据类型转换。不幸的是,这导致了一个错误的思维定式,其中>>
被认为是处理交互式输入的自动选择。不是这样。
正确的做法是使用std::getline()
。然后,如有必要,构建一个std::istringstream
,并使用它来处理来自输入输入的任何类型转换。这不仅解决了眼前的问题,而且解决了输入不可分割的问题,使得输入失败的状态变得失败,随后所有尝试的输入转换都失败了 - 这是另一个常见的错误。
因此,使用std::getline()
,第一:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
int main(void) {
std::cout << "Enter 4 words:" << endl;
std::string line;
std::getline(std::cin, line);
而现在,一旦输入的文本行,它可以被转换为std::istringstream
:
std::istringstream i(line);
随之而来的是循环反复调用>>
以计算这一行中的单词。这部分你可以完成自己。
P.S.另一个常见的陷阱是using namespace std;
。 You should not do that, as well。早期的良好编程实践被获得后,C++ guru-ism的道路将会越来越容易。
知道关于['的std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)和['的std :: istringstream'](HTTP ://en.cppreference.com/w/cpp/io/basic_istringstream)应该会有所帮助。 –