【小技巧】如何输入未知长度的数组,用回车结束输入

今天做了“去哪儿”的笔试,编程题并不难,但是卡在输入数据上了,数据读都读不进来,很让人恼火。

一般的题目输入数据会是这样:
第一行:一个整数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=='\n')
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

https://zhidao.baidu.com/question/1895481546423695740.html

https://blog.csdn.net/loveliuzz/article/details/73555058

 

posted @ 2018-10-10 14:27  皇家大鹏鹏  阅读(7136)  评论(0编辑  收藏  举报