今天做了“去哪儿”的笔试,编程题并不难,但是卡在输入数据上了,数据读都读不进来,很让人恼火。
一般的题目输入数据会是这样:
第一行:一个整数n,表示数组长度 (6)
第二行:n个整数,之间用空格隔开 (1 4 1 1 5 6)
但是去哪儿的题目挺奇怪,输入只有一行
第一行:输入n个整数,以空格隔开 (1 3 4 6 7 8)
这样带来一个问题,读取并存储这些数据有一定的困难,我最开始是用while(cin>>a),但是这样的问题在于程序并不以“回车”作为结束跳出循环,而是一直处在输入数据的状态,即便是我已经吧输入的数据存入数组或者向量,程序依然是在处理输入。后来我又想用getline()函数,但是这个函数把空格也当为一个字符读入,这对于数据的存储是一件很麻烦的事情;后来经过在网上查找资料,我注意到这个问题使用get()函数放入while循环中来处理是个不错的办法
下面这种情况是知道要输入多少数据,比较好处理一些
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int main() 5 { 6 int num; 7 cin >> num; 8 9 vector<int> vecNum; 10 int temp; 11 for (int i = 0; i < num; ++i) 12 { 13 cin >> temp; 14 vecNum.push_back(temp); 15 } 16 17 for (vector<int>::iterator itr = vecNum.begin(); itr != vecNum.end(); ++itr) 18 { 19 cout << *itr << endl; 20 } 21 22 return 0; 23 }
像下面这种情况就像我之前说的,一直会陷入while中,无法执行while后面的数据,这种情况适合需要输入和处理的数据全部都在while中;示例如下,15、16行的数据根本执行不到,因为单步调试就会发现一直是在处理cin
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main() 6 { 7 int a; 8 vector<int> v(100); 9 while (cin >> a) 10 { 11 cout << -1 * a << endl; 12 v.push_back(a); 13 cout << a << endl; 14 } 15 cout << "hahah" << endl; 16 for (int i = 0; i < v.size(); i++) 17 cout << v[i] * 10 << endl; 18 return 0; 19 }
下面这种就是使用get()的方法,也是目前来说最好的方法,可以读取长度未知的整数;当然也可以每次输入的数据使用vector的push_back()方法,这样就不用担心会下标访问越界,这样的方式适合用在输入不定长度的、以空格分隔、以回车结尾、后面还需需要进一步处理的数据
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 int arr[100]; 7 int temp; 8 int count=0; 9 char c; 10 while(((cin>>temp).get(c))) 11 { 12 13 arr[count]=temp; 14 if(c==' ') 15 break; 16 count++; 17 if(count>=100) 18 break; 19 } 20 for(int i=0;i<=count;i++) 21 cout<<arr[i]; 22 system("pause"); 23 return 0; 24 25 }
参考资料:
https://bbs.csdn.net/topics/391821665