2016-11-09 64 views
0

如何这个程序应该工作的结束:C++:读取多个输入只行

输入4个字:

这是不好的

错误输入。

输入4个字:

你好,你喜欢它

良好的输入。

我怎么试了一下:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) { 
    cout << "Enter 4 words:" << endl; 
    string a, b, c, d; 
    cin >> a >> b >> c >> d; 
} 

这行结束后读取输入,我无法弄清楚如何限制它只能一条线。你能指出我应该使用什么功能吗?我会非常感谢每一个答案。

谢谢大家!

+5

知道关于['的std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)和['的std :: istringstream'](HTTP ://en.cppreference.com/w/cpp/io/basic_istringstream)应该会有所帮助。 –

回答

1

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的道路将会越来越容易。

0

应使用以下命令: std::getline() 这忽视了最终的空间,报价终止字符串,也可以将该值存储在变量中,然后看看有多少话是内部的。 实施例: std::getline (std::cin,name);