cin>>与cin.get()是cpp程序常用到的输入函数,近日在编写一道简单的习题时,对二者产生了一些疑问(题目来源《C++ primer plus》中文版习题第七章第六题)
题干描述如下:编写函数Fill_array(),它以一个double型数组的名称和长度作为参数,它提示用户输入double值,并将这些值存储到数组中。当数组被填满或用户输入非数字时,输入将停止,并返回实际输入了多少数字。
原题还要求写Show_array()和Reverse_array(),这里就先忽略了。书中所给出的源码如下:
int Fill_array(double[], int);
int Fill_array(double arr[], int size)
{
int count = 0;
double temp;
cout << "Enter the number separate by blank,'s' to stop : ";
cin >> temp;
while (count < size)
{
if (cin.get() == 's')
{
return count;
}
else
{
arr[count++] = temp;
cin >> temp;
}
}
return count;
}
我最初的理解是:每输入一个浮点数,用一个空格隔开,最后在一个空格后输入s,停止输入,并将最后一个空格前的所有数字保存在浮点数组中,程序运行如下:
首先要说明的是,我预先将数组的最大长度设为了5,所以这里会出现1 2 3 0 0的情况说明程序没有在碰到s停止,而是在数组长度等于最大长度后自然退出了。
经过调试,我调整了输入的数字串,结果如下:
首先,程序在遇到s后会停止了,但是4.0却没有被加入到数组中。针对这一问题,就要深究一下cin>>和cin.get()在接收输入的字符时的用法了。
char a;
char b;
char c;
a = cin.get();
b = cin.get();
c = cin.get();
cout << a << endl;
cout << b << endl;
cout << c << endl;
由此可见,cin.get()在接收输入时,会接收空格;
char a;
char b;
cin >> a >> b;
cout << a << endl;
cout << b << endl;
由此可见,当cin的对象为char时,cin一次只会接收一个字符,且会把空格忽略。
现在我们可以对源代码进行解释了。在第一次cin>>temp
时,接收了1.0(由于temp类型为double,整个1.0都被接受而不是只有一个字符1被接受)。接下来,cin.get()
接受了空格,由于其不为‘s’
,程序将temp(1.0)
加入到数组中,并将count
自增。
在while
循环体的最后,cin
接受第二个temp(2.0)
。第二次进入循环体,程序判断了2.0
之后是否为s
,在判断其为空格而不是s
后,继续往下执行。
在正确的那次输入中,系统在倒数第二次进入循环时把temp
赋值为4.0
,但是最后一次进入循环时,程序判断到了字符s
。那么,还没等到将temp=4.0
加入到array
中,Fill_array()
函数就退出了。
备注:题目要求当用户输入非数字时,输入将停止。不过我没有看出来源码里哪里体现了这一点,即使输入:
1 2 3 4 a
,输出结果同样是:1 2 3 4 0
,这里还请各位朋友指点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)