在插入名称之后,然后按 CTRL + D (Unix)或 CTRL + Z 终止输入流。 kbd>(Win),该程序将提示您再次输入年龄,但事实并非如此。拜托,你能告诉我为什么吗?谢谢。
在这里,我使用此代码中没有的打印功能参考。
在线编译https://onlinegdb.com/BkFNcWSgv-以下是相同的代码:↓
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const vector<string>& read_names(vector<string> &n) {
for(string temp; cin >> temp;)
n.push_back(temp);
return n;
};
const vector<double>& read_ages(vector<double> &a) {
for(double temp; cin >> temp;)
a.push_back(temp);
return a;
};
int main()
{
vector<string> name;
vector<string>& nn = name;
vector<double> age;
vector<double>& aa = age;
nn = read_names(name);
aa = read_ages(age);
return 0;
}
答案 0 :(得分:1)
Ctrl + D的行为取决于您的终端。我在VSCode中尝试过,似乎可以关闭输入流。我无法重新打开它。
在我的Linux终端(Tilix)中,Ctrl-D发送EOF。 std::cin.clear()
之后,goodbit
被设置,我可以再次读取用户输入。 https://en.cppreference.com/w/cpp/io/ios_base/iostate
它在VSCode和Tilix中表现不同。
以下代码对我有用。我不知道Windows,Mac或其他操作系统中的行为。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
const std::vector<std::string>& read_names(std::vector<std::string>& n) {
for (std::string temp; std::cin >> temp;) n.push_back(temp);
return n;
}
const std::vector<double>& read_ages(std::vector<double>& a) {
for (double temp; std::cin >> temp;) a.push_back(temp);
return a;
}
int main() {
std::vector<std::string> name;
std::vector<std::string>& nn = name;
std::vector<double> age;
std::vector<double>& aa = age;
//std::cout << std::cin.rdstate() << '\n';
nn = read_names(name);
//std::cout << std::cin.rdstate() << '\n';
std::cin.clear();
//std::cout << std::cin.rdstate() << '\n';
aa = read_ages(age);
std::cout << nn.size() << '\n';
std::cout << aa.size() << '\n';
//std::cout << std::cin.rdstate() << '\n';
return 0;
}