在向量循环 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 而不是forfor 循环通常在您知道要执行多少次循环迭代时使用 - 或者它是可计算的。 while 循环或do...while 循环在这里比for 循环更合适,因为您不知道用户想要执行多少次循环。 尝试点击&lt;enter&gt; 刷新缓冲区,然后点击&lt;ctrl&gt;-z 发送流结束信号。 我这样做了,但是在 CTRL+Z 之后必须按 。感谢您的信息 另一种方法是在外部将数据通过管道传输到标准输入 echo "one two three four" &gt; 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 &gt;&gt; palabras 的 EOF 完全没问题。 @BessieTheCow 作者在阅读标准输入时遇到了麻烦,因为他使用了std::istreambool 的演员表,他试图将其设为假。我只是建议用简单的条件编写循环 如果不推荐读取 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++ 之前验证用户输入

我想通过在 C++ 中使用向量来获取用户输入,但我得到了无限循环

在 C++ 中将字符串转换为向量

使用 C++,尝试使用 for 循环和 std::max 查找向量中的最大单词

c++ 中将标准输入内容读入字符串或向量的最快方法

在 C++ 中比较来自向量的字符串时出现分段错误