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

clu*_*guy 10 c++ cin

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

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

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

Sta*_*nny 10

正如@SidS评论的那样,空白被丢弃了.所以你必须考虑另一种策略.你可以改为检查是否row为空.但这只适用于std::getline:

#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";
}
Run Code Online (Sandbox Code Playgroud)

OP,如果你想保存单个单词(而不是整行),你可以用它regex来单手推送每个单词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';
    }
}
Run Code Online (Sandbox Code Playgroud)

示例运行:

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] = /////
Run Code Online (Sandbox Code Playgroud)