该程序应如何工作:


  输入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;
}


它在行尾之后读取输入,但我不知道如何将其限制为仅一行。您能指出我应该使用什么功能吗?我会很感激每个答案。

谢谢你们!

最佳答案

当程序的预期输入来自交互式终端时,应使用std::getline()

这就是std::getline()的作用:它将读取文本,直到换行符为止。 operator>>不会那样做,这就是std::getline()所做的,那才是用来处理一行键入文本的内容。使用正确的工具进行正确的工作。

可悲的是,许多C ++书籍和教程在介绍>>之前就过早引入std::getline()并在示例中使用它,只是因为>>处理所需的数据类型转换更容易,更方便。不幸的是,这会导致错误的思维定势,其中>>被认为是处理交互式输入的自动选择。它不是。

正确的方法是使用std::getline()。然后,如有必要,构造一个std::istringstream,并使用它来处理来自输入输入的任何类型转换。这不仅解决了眼前的问题,还解决了无法解析的输入将std::cin置于失败状态的问题,所有后续尝试的输入转换也都失败了-这是另一个常见的陷阱。

因此,首先使用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);


后跟一个循环,反复调用>>以便计算此行中的单词。这部分您可以自己完成。

附言另一个常见的陷阱是using namespace std;You should not do that, as well。越早获得良好的编程实践,朝着C ++大师主义的发展之路就越容易。

关于c++ - C++:仅读取多个输入到行尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40507692/

10-17 01:29