在C++中读取多行输入

Reading multi line inputs in C++

本文关键字:输入 读取 C++      更新时间:2023-10-16

我正试图从C++中的命令行读取多行输入,并将它们存储到一个数组中。这是我的密码。

std::string line;
    int in;
    std::vector<std::string> v;
    while(std::getline(std::cin, line)){
        if(line == "^D") break;
        v.push_back(line);
    }
    for(auto it = v.begin(); it != v.end(); it++){
        std::cout<<*it<<std::endl;
    }

stdin进入了一个无限循环,我似乎不知道如何防止它。基本上,目标行为是在没有任何输入的情况下连续按两次回车键,应终止stdin循环并运行程序。

我会测试字符串是否为空。如果是这样,就中断。像这样:

#include <string>
#include <vector>
#include <iostream>
int main(){
std::string line;
std::vector<std::string> v;
while(std::getline(std::cin, line)){
    if (line.empty()){
        break;
    }
    v.push_back(line);
}
std::vector<std::string>::iterator it;
for (it = v.begin(); it != v.end(); it++){
    std::cout << *it << 'n';
}
return 0;
}

如果您真的希望循环以两个Enter停止,您可以将条件更改为

if(line == "" && v.size() >= 1 && v.back() == "") break;

它应该检查当前击键和上一次击键是否为Enter。v.size() >= 1只是检查v中是否有任何元素,如果没有任何其他元素,则停止Segfault。

请注意,数组中的最后一个元素将是一个空字符串,如果您想去掉它,只需编写

v.pop_back();

在第一个循环之外,它去掉了最后一个元素。

while循环可能是这样的,只使用.empty():

while(std::getline(cin, line)){
    if(line.empty() && !v.empty() && v.back().empty()) {
        v.pop_back(); // remove the last empty line
        break;
    }
    v.push_back(line); 
}