关于getline()函数跳过了一次输入数据

weixin_41491734 2019-02-01 12:59:14
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200
岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入描述:
输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及
按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。


输出描述:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。

输入例子:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

输出例子:
3 Tom John



我的前半部分读入数据的代码如下,问题描述在代码的注释中


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

using namespace std;

int main()
{
int N;
cin >> N;
vector<string> vec;
//读入N次数据
while (N--)
{
string s;
//问题出在这里,第一次会跳过输入,循环到下一次的时候才会正常读入数据
//这就导致了vec中第一个元素是个空字符串,我不知道是为什么,是getline没用对吗?
getline(cin, s);
vec.push_back(s);

}

for (auto s : vec) cout << s << endl;

vector<int> vec_time;
for (auto s : vec)
{
string s1 = "";
for (auto c : s)
{
cout<<"here"<<endl;
if (isdigit(c)) s1.push_back(c);
}
int a = stoi(s1);
vec_time.push_back(a);
}

for (auto i : vec_time) cout << i << endl;



}

...全文
737 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
觉非 2019-02-14
  • 打赏
  • 举报
回复
cin >> N;之后加上这一句cin.ignore();
用cin>>和getline混合使用时,需注意使用getline函数之前,输入流中可能会有换行符,如果有则使用cin.ignore清除。
阿_波_ 2019-02-09
  • 打赏
  • 举报
回复
5之后的换行符需要处理一下,使用getchar解决一下就好了
名字在哪啊 2019-02-06
  • 打赏
  • 举报
回复
换行符被当成一个一个string型的字符串给S了,而换行符显示是空,所以你才会觉得跳过了输入,需要在输入N之后写一个接受这个换行符的代码,比如getchar();
独孤过 2019-02-01
  • 打赏
  • 举报
回复
cin >> N; 这句话只会接收5,剩下换行回车符未被接收 在其后增加cin.get();,以抵消换行回车

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧