C++ primer plus第七章习题中遇到的cin与cin.get问题

在这里插入图片描述

在这里插入图片描述

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 : ";
        //输入碰到s则停止
        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;
//输入: 1 2 3(数字之间有一个空格)
/*输出:
1

3*/

由此可见,cin.get()在接收输入时,会接收空格;

char a;
char b;
cin >> a >> b;
cout << a << endl;
cout << b << endl;
/*
输入:12(数字之间没有空格)
输出:
1
2

输入:1 2(数字之间有空格)
输出:
1
2
*/

由此可见,当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,这里还请各位朋友指点。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon Zha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值