————————————————
正常情况下,我们要从键盘读一个数组,一般会先告诉你一个数组大小size,然后可以创建相应的数组a[size](注:C++11允许变量作为数组长度)或者建立vector<T>(size). 然后就可以用一个size次的循环正好把size个数组元素存进去。
int main()
{
int n = 0;
cin >> n;
vector<int> p(n);
for(int i = 0; i < n; i++){
cin >> p[i];
}
return 0;
}
但是如果不给数组长度怎么办?直接扔给你一个行数组元素,怎么把他们存到对应整数数组中呢?
1.while(cin>>a[i++])好像是不可以的。cin>>操作符是根据后面变量的类型读取数据。
输入结束条件 :遇到Enter、Space、Tab键。 对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)
在VS2103中,输入一行数组元素之后他不会终止,会让你继续输入。
2.这种方法使用getchar和cin共同进行处理。假设输入为-1,1,-1,1。首先,cin>>会根据i的类型读一个int,他遇到space会终止,因此第一次得到-1,接着每次getchar都会得到一个空格,这时候继续读就会读到第二个元素1,一直while到终止条件,读到一个换行符“\n”.
int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。
int main()
{
vector<int> a;
int i = 0;
do{
cin >> i;
a.push_back(i);
}while(getchar() !='\n');
return 0;
}
注意不要如下使用while循环的形式,getchar会消耗掉一个字符。
while(getchar() != '\n')
{
cin>>i;
a.push_back(i);
}
输出的vector会缺少输入的第一个字符
while (getchar()!='\n') ; 表示循环读入字符,直到读到回车符结束循环。这个语句,还可以做到清除输入多余的字符,如:
char ch[11]; //最多能存储10个字符
getline( ch, 10 ); //输入10个字符,可是用户有可能输入10个以上的字符,于是可用上面的语句来清除缓存的数据。
while (getchar()!='\n') ;
//这样,后续的读数据操作,就不会受这里的输入影响了。
3.使用getline(cin, str)读到一行字符串,然后将getline得到的stringstream input中,然后input>>输出会被space截断,直接>>到一个int类型这种就可以自动实现类型转换,也很方便。当然也可以用atoi。
#include<sstream> //注意加这个头
int main()
{
string str,temp;
getline(cin, str);
int i = 0;
vector<int> p;
stringstream input(str);
while(input >> i){
p.push_back(i);
}
return 0;
}