我尝试从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进入无限循环,而我似乎想不出如何防止这种情况发生。基本上,目标行为是在没有任何输入的情况下连续按两次enter键来终止stdin循环并运行程序。
发布于 2015-11-25 19:20:25
我将测试字符串是否为空。如果是这样,就中断。如下所示:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(){
string line;
vector<string> v;
while(std::getline(cin, line)){
if (line.empty()){
break;
}
v.push_back(line);
}
vector<string>::iterator it;
for (it = v.begin(); it != v.end(); it++){
cout << *it << '\n';
}
return 0;
}
发布于 2015-11-25 19:18:49
如果您确实希望循环在两个Enter结束时停止,可以将条件更改为
if(line == "" && v.size() >= 1 && v.back() == "") break;
它应该检查当前击键和前一次击键是否为Enter's。v.size() >= 1
只是检查v中是否有任何元素,如果没有任何其他元素,则停止Segfault。
请注意,数组中的最后一个元素将是一个空字符串,如果您想摆脱它,只需编写
v.pop_back();
在第一个循环之外,它去掉了最后一个元素。
发布于 2022-02-18 08:20:25
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);
}
https://stackoverflow.com/questions/33924558
复制