不是原创,摘录自https://www.cnblogs.com/JeasonIsCoding/p/9848286.html
原来cin只是在缓存区中,把字符读走,会剩余/n在缓存区中。
但是getline对/n极度敏感,导致getline刚开始读入便遇到/n于是停止读入数据。
getline之后,别cin
cin之后,尽量也别getline
#include<iostream>
#include<string>
using namespace std;
int main() {
int age;
string name;
cout<<"请输入年龄:"<<endl;
cin>>age;
cout<<"请输入姓名:"<<endl;
getline(cin,name);
cout<<"年龄:"<<age<<endl;
cout<<"姓名:"<<name<<endl;
return 0;
}
我们先看下cin>>与getline的工作方式,
cin流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。
getline函数从istream中读取一行数据,当遇到“\n”时结束返回。
造成程序错误结果的原因是,用户输入完年龄后按回车结束输入,把“\n”留在了输入流里,而cin不会主动删除输入流内的换行符,这样换行符就被getline读取到,getline遇到换行符返回,因此程序不会等待用户输入。
解决的办法是手动清除换行符,在cin>>后加上 cin.ignore();
因此在使用getline函数之前要注意,输入流中是否有可能会有换行符,如果有则使用cin.ignore清除。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <sstream>
using namespace std;
string s;
string a,b;
vector<string> res;
string word;
int main() {
while(getline(cin,s) ) {
//用getline之后,最好统一getline 否则出错!不知道为什么
cin >> a;
cin >> b;
/*
getline(cin,a);
getline(cin,b);
*/
res.clear();
int index = s.find(" ");//3
while(index != -1) {
word = s.substr(0,index); // 0 len
if (word == a) {
res.push_back(b);
} else {
res.push_back(word);
}
s.erase(0,index + 1);
// cout << "qingchuhou:" << s <<endl;
index = s.find(" ");
}
if (s.size() > 0) {
res.push_back(s);
}
for (int i = 0; i <= res.size() - 1; i++) {
cout <<res[i] << " ";
}
cout << endl;
//cout << res[res.size() - 1] << endl;
// 非常重要
cin.ignore();//把/n删掉!
}
}