试图将未知数量的字符串推入向量,但是我的cin循环没有终止

时间:2019-01-23 07:53:05

标签: c++ cin

我试图从cin中获取字符串作为输入,然后每次将字符串推入向量中。但是,即使在所有输入的末尾加上“ \”,我的循环也不会终止。

int main(void) {
    string row;
    vector<string> log;
    while (cin >> row) {
        if (row == "\n") {
            break;
        }
        log.push_back(row);
    }
    return 0;
}

我尝试用(cin >> row)替换(getline(cin,row)),但没有任何区别。我已经尝试过使用stringstream,但是我真的不知道它是如何工作的。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:9)

如@SidS所评论,空格被丢弃。因此,您必须考虑另一种策略。 您可以改为检查https://maps.googleapis.com/maps/api/geocode/json?address=ADDRESS&key=KEY是否为空。但这仅适用于row

std::getline

OP,如果要保存单个单词(而不是整行),可以在输入后使用regex单手将每个单词推入#include <vector> #include <string> #include <iostream> int main() { std::string row; std::vector<std::string> log; while (std::getline(std::cin, row)) { if (row.empty()) { break; } log.push_back(row); } std::cout << "done\n"; } 中。

log

示例运行:

#include <vector>
#include <string>
#include <iostream>
#include <regex>

int main() {
    const std::regex words_reg{ "[^\\s]+" };

    std::string row;
    std::vector<std::string> log;
    while (std::getline(std::cin, row)) {
        if (row.empty()) {
            break;
        }
        for (auto it = std::sregex_iterator(row.begin(), row.end(), words_reg); it != std::sregex_iterator(); ++it){
            log.push_back((*it)[0]);
        }
    }
    for (unsigned i = 0u; i < log.size(); ++i) {
        std::cout << "log[" << i << "] = " << log[i] << '\n';
    }
}

答案 1 :(得分:2)

如果您要存储std::cin one 行的令牌,请按照标准机制进行分隔,例如operator>>中的<iostream>重载(即,按空格/换行符分隔),您可以这样做:

std::string line;
std::getline(std::cin, line);
std::stringstream ss{line};

const std::vector<std::string> tokens{std::istream_iterator<std::string>{ss},
    std::istream_iterator<std::string>{}};

请注意,这不是最有效的解决方案,但它应能按预期工作:仅处理一行并使用现有机制将该行拆分为单独的std::string对象。

答案 2 :(得分:1)

您不能使用字符串hello you a b c d e f g 18939823 @_@_@ ///// log[0] = hello log[1] = you log[2] = a log[3] = b log[4] = c log[5] = d log[6] = e log[7] = f log[8] = g log[9] = 18939823 log[10] = @_@_@ log[11] = ///// 来读取换行符。该运算符将忽略空格,并且将永远不会返回字符串istream& operator >>。考虑改用getline