关于getline()函数好使但是有毒;
有两种操作需要进行特殊处理:
First:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm> #include <sstream> using namespace std; int n; int a[100]; int b[100],c[100]; int main() { while (cin>>n) { string s; //测试样例请用: // 10// 1 2 3 4 5//6 7 8 9 string ss; string sss; getline(cin,s); //自己想想这一个存的啥; getline(cin,ss); //这个呢 getline(cin,sss); //还有这个。。 cout<<s<<endl<<ss<<endl<<sss<<endl; } return 0; }
输出结果你蒙(应该是蒙吧,难道你知道?神犇!?)对了么??
cin>>n;进行完毕之后有一个\n;但是\n并不能存到n中,于是留在了缓冲区;
而当s进行读入一行操作时,实际上存入的是\n。
那么你在 ss中读入1 2 3 4 5 之后的换行为什么不需要另开一个string类型存储,反而6 7 8 9可以直接存到sss中去呢??想一下;
因为是读入一行操作,\n会被存入那一行中,而不是像n一样不能存储。所以不需要重开一个,你蒙对了么(馬鹿?)
还有另一种输入引发的另一个问题,(注意读取无用行的位置不同)
Second:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <sstream> using namespace std; int n; int a[100]; int b[100],c[100]; int main() { string s; string ss; string buf; while (getline(cin,s)) { int a; //如果你还是在这里插入getline(cin,buf)而不是最后;那么第一次循环buf会取代ss读入,ss就会读下一行而不是应该读取的这一行;第二次循环时s读入不了; getline(cin,ss); cin>>a; //这里会遗留\n; getline(cin,buf); } return 0; }
PS:
这个问题为什么提出,解决什么问题呢??
题目中若要求在一组样例中读入多行则需要注意你读入的究竟是什么东西。
时间: 2024-11-06 03:44:18