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

2023-05-16

在这里插入图片描述

在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Python中requests库使用方法详解

    python中requests库使用方法详解 前言 xff1a 一 什么是Requests二 安装Requests库三 各种请求方式1 基本的GET请求2 带参数的GET请求3 解析json4 获取二进制数据5 添加headers6 基本P
  • File Browser的安装(适用于Kali/Ubuntu/Debian)

    filebrowser是一个基于Go开发的开源轻量级免费的文件浏览器 xff0c 可以把电脑上的文件快速传到其他设备上 1 下载 下载地址 xff1a https github com filebrowser filebrowser rel
  • Ubuntu 挂载硬盘到 /home 目录下扩容

    实验室提供的 NVIDIA Jetson NX 内存容量太小 xff0c 只有16G xff0c 刷完机装上系统和 CUDA 等安装包后 xff0c 系统只剩下一点多个G xff0c 后面完全是不够用的 xff0c 因此需要加硬盘并挂载才能
  • vue-element-admin 二次开发 报错修改

    安装 GitHub git clone https github com PanJiaChen vue element admin git Gitee https gitee com panjiachen vue element admin
  • 常用字符串函数

    1 strlen 函数 strlen 函数用来计算字符串长度 用法 xff1a 结果 xff1a 2 strcpy 函数 用来将一个数组的内容拷贝到另一个数组 用法 xff1a 结果 xff1a 注意 xff1a 如果a1中的比a2中的长
  • C++ 学习日志——STL中的容器 Vector

    本文简单的介绍下STL下的容器 vector的简单的存放和遍历方法 目录 一 vector存放和访问方式 二 三种遍历方式 三 vector存放对象 四 vector存放指针 难点 一 vector存放和访问方式 迭代器 xff1a vec
  • ARM汇编程序入门实践

    一 stm32程序 1 新建工程 1 xff09 双击打开keil xff0c 点击菜单栏Project gt New Vision Project xff0c 新建项目 xff0c 在弹窗中设置工程项目的名称和路径 xff0c 在这里 x
  • 【STM32学习笔记】(5)—— STM32工程添加源文件和头文件

    向工程目录里创建头文件和源文件 STM32的工程文件构成较为复杂 xff0c 同时为STM32工程文件添加源文件和头文件也是较为复杂的 xff0c 下面就由此文章来介绍怎么给STM32工程添加源文件 xff08 c xff09 与头文件 x
  • 在STM32中使用printf函数

    一 目的 利用printf函数使得输出打印到串口中 二 工作原理 我们在C语言中为什么能够调用printf函数打印数据到控制台中 xff0c 那是因为printf函数又调用了fputc 函数 那么我们我们可不可以说printf函数之所以能够
  • 电赛备赛日记(一):K210与STM32串口通信

    拖更了n久的备赛日记终于来啦 xff0c 最近实现了关于K210图像识别并将所需数据 xff08 即目标类别 xff0c 目标在图像中的加权坐标 xff09 其中 xff0c 加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐
  • 实验作业2(数组)

    64 TOC实验题目2 xff1a 某公司生产5种产品 xff0c 每周记录生产的每种产品数量和销售数量 每个月月末 xff0c 公司将对其生产规划进行评估 该评估需要以下一个或多个信息 每周生成和销售的数量 xff1b 所有生产产品的总量
  • 函数作业

    仅供交流 xff0c 禁止抄袭 实验一 求序列的和 问题描述 求Y 61 1 1 2 43 1 3 1 4 43 1 2 n 的前n项之和 输入形式 从键盘输入n 输出形式 输出n项和 按四舍五入的方式精确到小数点后第二位 样例输入 30
  • Windows下MySQL安装及配置

    目录 1 MySQL下载2 MySQL配置 mysql版本 xff1a 5 7 注 xff1a 1 现在最新的mysql版本是8 0 xff0c 但是一般安装软件都不推荐安装最新版本的 xff0c 因为可能会有一些错误无法预见 xff0c
  • SLAM遇到的问题及技巧

    文章目录 1 rosbag太大了 xff0c 打不开2 机器人的三维变换roslaunch的node强制关闭了 xff0c exit code 11 1 rosbag太大了 xff0c 打不开 以LZ4格式压缩 rosbag compres
  • 关于螺旋数组的讨论

    下面收集了几种可能的螺旋数组形式以及相应的主代码 供大家学习参考 给定N的值 xff0c 从矩阵的左上角输出顺时针螺旋矩阵 例如N 61 4时 xff0c 输出 xff1a 1 2 3 4 12 13 14 5 11 16 15 6 10
  • 动态链接库dll详解

    动态链接库概述 DLL就是整个Windows操作系统的基础 动态链接库不能直接运行 xff0c 也不能接收消息他们是一些独立的文件 Windows API中的所有函数都包含在DLL中 其中有三个最重要的DLL kernel32 dll xf
  • stm32中printf重定向

    先上代码 加入以下代码 支持printf函数 而不需要选择use MicroLIB if 1 pragma import use no semihosting 标准库需要的支持函数 struct FILE int handle FILE s
  • STM32F103RCTX 串口USART 不定长接收

    串口不定长接收的方法有多种 xff0c 这里我所介绍的是通过设置IDLE中断来检测串口是否接收完毕 xff0c 从而结束串口接受中断 1 首先设置串口 xff0c 如下图所示 xff1a 2 使用IDLE中断检测 xff0c 所以需要开启对
  • ROS通信模式/动作编程(设置收发节点,使小海龟移动到指定位置)以及分布式通信

    文章目录 一 话题 服务模式编程1 1 创建工作空间1 1 1 创建ROS工程包1 1 2 在工作区编译工程包 1 2 话题模式编程1 2 1 创建通信的收 发节点1 2 1 1 在src目录中创建一个发布节点1 2 1 2 在src目录中
  • Ubuntu18.04安装ros(顺利解决 sudo rosdep init 与 rosdep update 存在的问题,附保姆级图文流程)

    Ubuntu18 04 xff08 Ubuntu20 04 xff09 安装ros 顺利解决 sudo rosdep init 与rosdep update 存在的问题 xff0c 附保姆级图文流程 前言 安装了很多次 xff0c 东拼西凑

随机推荐

  • linux命令发送接口请求

    curl k X POST H 34 Accept Encoding gzip deflate 34 H 34 Content type application 34 H 34 x www form urlencoded UTF 8 34
  • UDP协议及编程

    UDP协议 UDP是无连接的 xff0c 即发送数据之前不需要连接 xff0c 因此减少了开销和发送数据之间的时延 UDP使用尽最大努力交付 xff0c 即不保证可靠交付 xff0c 因此主机不需要维持复杂的连接状态表 UDP是面向报文的
  • 24.STM32的IO口扩展PCF8574

    1 IO口扩展芯片 PCF8574是一款带IIC总线 xff0c 可使大多数MCU实现远程I O 口扩展 该器件包含一个8位准双向口和一个IIC总线接口 xff08 通信接口IIC xff0c 2根线可以扩展为8个口 xff09 PCF85
  • 网络编程(二)基础预备知识掌握

    网络编程预备知识 socket 是一种编程接口也是一种文件描述符 xff08 套接字 xff09 可用于 TCP UDP IPX通信 socket的类型 流式套接字 xff08 SOCK STREAM xff09 xff1a 提供一种面向连
  • 使用USTC-TK2016工具对USTC-TFC2016数据集进行处理——报错解决记录

    USTC TK2016数据处理工具 xff1a https github com yungshenglu USTC TK2016 USTC TFC2016数据集 xff1a https github com yungshenglu USTC
  • C++避免头文件重复包含问题

    避免头文件重复包含的方法 xff0c 通常有两种做法 xff1a 条件编译和 pragma once 条件编译就是通常的 ifndef XXX H define XXX H endif ifndef XXX H 表示 xff0c 如果没有包
  • c++ 调用yolov3-yolov4

    ifdef WIN32 define OPENCV define GPU endif include lt iostream gt include lt windows h gt include 34 yolo v2 class hpp 3
  • 一文搞懂UART、RS232、RS485、TTL等常用的接口与协议

    常用的接口与协议 PC机常用的按照接口数量细分为A型 xff08 15针 xff09 xff0c B型 xff08 25针 xff09 xff0c C型 xff08 37针 xff09 xff0c D型 xff08 50针 xff09 xf
  • 解决头文件重复包含与结构体未定义的问题

    一 养成良好的编程习惯 1 保证h文件的纯洁性 xff1a 尽量一个c文件对应一个h文件 xff0c 不要h文件包含许多h文件 这样可以优化编译速度且避免出现h文件中某个结构体之类未定义 xff0c 先在上个h文件中使用的错误 2 对于变量
  • Nokia 5110液晶屏显示模块的使用与开发

    Nokia 5110液晶屏显示模块 我们先来看看他的参数 nbsp 在深入研究连接和示例代码之前 让我们首先看一下其Pinout nbsp RST nbsp 针复位显示 它是低电平有效引脚 您可以通过将其拉低来重置显示 您也可以将此引脚连接
  • mongodb的文档的分页查询

    统计查询使用count xff08 xff09 方法 xff1a 统计comment集合的所有的记录数 xff1a db comment count 分页列表查询 xff1a 可以使用limit xff08 xff09 方法来读取指定数量的
  • 前后端分离项目的部署

    本次项目的项目架构图 xff1a Nginx主要部署的是 项目的静态资源 xff0c 即前端项目 通过Nginx的反向代理 xff0c 将请求发给Tomcat服务器 然后获取数据通过MySQL的主从复制 xff0c 主库负责更新数据 xff
  • echarts基本用法

    目录 tooltip 设置提示框信息 图表的提示框组件 legend 图例组件 toolbox 工具箱组件 可以另存为图片等功能 grid 网格配置 grid可以控制线型图 柱状图 图表大小 xAxs 设置x轴的相关配置 y轴同理 seri
  • java实现UDP通信传输信息

    实现UDP通信要依靠 DatagramPacket对象进行实现 UDP协议的相关介绍 xff1a UDP传输分为 服务端 和客户端 服务端发送消息 客户端接收消息 xff0c 服务端需要知晓客户端的 IP和所监听的端口号 话不多说直接上代码
  • MySQL篇之动态建表。

    在日常开发中 xff0c 可能会出现 动态配置的一些情况 xff0c 此时存储动态配置的一些数据时就需要动态建表了 xff0c 家人们可以选则两种方案 一种是采用mybatis的mapper xml文件里面使用 语句进行创建 二就是使用da
  • IDEA 2020.2 配置Tomcat服务器

    1 创建一个工程 2 右键项目名称 xff0c 选择 add framwork support 3 选中Web Application xff0c 默认勾选创建web xml 目录结构如下 4 点这两个地方中的任意一个 xff0c 添加配置
  • Java笔记之markdown语法

    狂神说Java系列视频笔记 本文章是作者学习B站系列视频 狂神说Java 的记录笔记与心得 xff0c 创作不易 xff0c 希望能够得到您的支持 1 Markdown的基本语法与使用 Markdown是当下一种较为流行的一种写作方法 通过
  • Java之数组专题

    文章目录 Java基础之数组专题数组的定义数组的声明与初始化数组元素的访问内存分析数组的使用For Each 循环数组作方法入参冒泡排序 多维数组稀疏数组 Java基础之数组专题 本文章是作者学习B站系列视频 狂神说Java 与经典书籍 J
  • Java封装详解

    Java类和对象 本文章是作者学习B站系列视频 狂神说Java 与经典书籍 Java核心技术 的记录笔记与心得 xff0c 创作不易 xff0c 希望能够得到您的支持 Java的构造器 Java的构造器 在用Java自定义类时 xff0c
  • C++ primer plus第七章习题中遇到的cin与cin.get问题

    cin gt gt 与cin get 是cpp程序常用到的输入函数 xff0c 近日在编写一道简单的习题时 xff0c 对二者产生了一些疑问 xff08 题目来源 C 43 43 primer plus 中文版习题第七章第六题 xff09