C++:只读取多个输入到行尾

标签 c++ cin

这个程序应该如何工作:

Enter 4 words:

this is bad

Bad input.

Enter 4 words:

hello you love it

Good input.

我是如何尝试的:

#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++:只读取多个输入到行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507692/

相关文章:

c++ - 带 If 的嵌套 For 循环的时间复杂度

c++ - LNK2019 Unresolved external symbol 错误

c++ - std::cin 上的 std::getline

c++ - Cin 显示默认值

C++11 智能指针和多态性

c++ - 在 ListView 中启用分组 - 句柄无效?

c++ - 如何在 C++ 中计算对象的哈希/校验和/指纹?

c++ - 在 C++ 中用 cin 读取同一行中的多个整数

c++ - 如何使用 cin 继续阅读直到到达空白行

c++ - 从标准输入解析参数的最快方法