C++的输入输出对于初学者来说是一件大难题!!!
做题的时候经常会遇到多行输入,有两种情况,(1)题目中给出输入是几行(2)输入行数未知。下面单独列举:
一、行数已知,读取多行数据。
*(1)*题目中给出输入n行,这个是最简单的。假如题目固定要求输入n行。
程序直接就是循环读入就好了,我这里贴的代码是每行有多个由空格分隔的字符串(string),分别处理每行中所有字符串。
for(int i=0;i<n;i++){
string input;
getline(cin, input);
stringstream stringin(input);
string str;
vector<string> temp;
while (stringin >> str) {
temp.push_back(str);
}
}
*(2)*题目中没有固定输入几行,让用户自己定义,到底是3行还是5行。所以在输入的时候首先用户先要输入行数n(cin>>n),然后再读入后面的这些行。这里如果cin输入完行数以后,打换行符,然后开始输入下一行数据,由于getline会把这个换行符识别出来,所以cin后面直接用getline读数据会导致读入的第一行是空(也就是3后面的那个换行符被当做第一行读进来了):
这里用户输入自定义行数3以后,换行输入后面的三行数据。这时如果cin后面直接用getline读下面三行的数据会造成读入的第一行为空。
所以,正确的程序应该是:
int n;
cin >> n;
cin.ignore();
for(int i=0;i<n;i++){
string input;
getline(cin, input);
stringstream stringin(input);
string str;
vector<string> temp;
while (stringin >> str) {
temp.push_back(str);
}
}
在用getline读行数据之前,先使用cin.ignore()忽略换行符、空格。就可以正确读入后面的那些行了。
二、行数未知
还有一种情况是多组输入,不知道输入几组,题目没给也不许用户自定义,就是我输入进来几行你程序要自动识别,并按行处理。
string input;
while(getline(cin, input)){
stringstream stringin(input);
string str;
vector<string> temp;
while (stringin >> str) {
temp.push_back(str);
}
}
用这个代码表示只要输入不结束,我就一直按行读取。但是这个需要用户在输入结束的时候另起一行输入“ctrl+z",getline可以识别这个符号作为输入的结束符。
如图,两行输入,怎么表示我输入完了?换行在键盘上敲"ctrl+z"会出现图中的"^Z"
OK啦!!!后面有其他的输入需求我会补充的~