在向量循环 C++ 中终止字符串输入
Posted
技术标签:
【中文标题】在向量循环 C++ 中终止字符串输入【英文标题】:Terminate string input in a vector loop C++ 【发布时间】:2020-08-01 00:12:46 【问题描述】:有一个练习动态地要求用户输入并存储在向量中,但我不知道如何结束字符串输入。这本书说它是 Ctrl+Z 但它不起作用。我正在使用 Visual Studio 2019,我知道它应该可以工作,因为当我更改整数的变量时它可以工作。
int main(void)
std::vector<std::string> words;
for (std::string palabras; std::cin >> palabras;)
words.push_back(palabras);
std::string ban = "broccoli";
for (std::string x : words)
if (x == ban) std::cout << "Bleep!" << '\n';
else std::cout << x << '\n';
【问题讨论】:
for
不适用于这些情况。使用while
而不是for
。 for
循环通常在您知道要执行多少次循环迭代时使用 - 或者它是可计算的。 while
循环或do...while
循环在这里比for
循环更合适,因为您不知道用户想要执行多少次循环。
尝试点击<enter>
刷新缓冲区,然后点击<ctrl>-z
发送流结束信号。
我这样做了,但是在 CTRL+Z 之后必须按 echo "one two three four" > app.exe
@Andy 我不同意。我认为 for 循环在这里非常合适,因为它允许我们方便地限制字符串变量的范围,它只在循环中使用。 for 循环通常用于已知次数的迭代,但没有理由不将其用于其他事情。
【参考方案1】:
保持简单:不要使用 std::cin
的返回值作为 for 循环条件,除非您确定会发生什么。这是一个简单的程序,它使用循环 完成您想要的操作。将这项工作内部变成一个循环将是一个很好的练习。
#include <iostream>
#include <string>
int main(int argc, char **argv)
std::string lovely_str;
std::cout << "Enter a string: ";
std::cin >> lovely_str;
std::cout << "got: " << lovely_str << "\n";
return 0;
如果您坚持使用您的原始程序,您可以使用ctrl+d
发出读取字符串结束的信号
【讨论】:
如果 OP 打算读取字符串直到出现错误或使用std::cin >> palabras
的 EOF 完全没问题。
@BessieTheCow 作者在阅读标准输入时遇到了麻烦,因为他使用了std::istream
到bool
的演员表,他试图将其设为假。我只是建议用简单的条件编写循环
如果不推荐读取 EOF 的方式,使用读取流作为循环条件是非常好的。 OP 知道代码在做什么,只是无法弄清楚如何在他的系统上发送 EOF,而您根本没有解决这个问题。
@BessieTheCow 好的,也解决了 EOF 问题【参考方案2】:
在std::istringstream
的帮助下,让生活更轻松(通知 cmets):
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main(void)
// To store the entire line of input
std::string input;
// To store the split words
std::vector<std::string> words;
// Temporary variable to iterate through
std::string temp;
// Constant string to be used
const std::string ban = "broccoli";
std::cout << "Enter some words: ";
std::getline(std::cin, input);
// Here we go
std::istringstream iss(input);
// Separating each words space, e.g. apple <sp> banana => vector apple|banana
while (iss >> temp)
words.push_back(temp);
// Using reference as for-each
for (auto& i : words)
if (i == ban) i = "bleep!";
// Printing the modified vector
for (auto& i : words) std::cout << i << ' ';
std::cout << std::endl;
return 0;
【讨论】:
以上是关于在向量循环 C++ 中终止字符串输入的主要内容,如果未能解决你的问题,请参考以下文章
我想通过在 C++ 中使用向量来获取用户输入,但我得到了无限循环