认识C++字符串复合类型

news/2024/5/8 9:27:25/文章来源:https://blog.csdn.net/muwithxi/article/details/129928780

目录

前言:

1.数组

1.1C++的数组

1.2C++数组初始化 

*2.字符串

2.1字符串与数组

2.2字符数组的存储

 2.3字符串输入cin

2.4cin.getline()

2.5cin.get()

2.6函数重载例子

2.7混合输入数字和字符串


前言:

  C++与C语言在内容上有些是一样的,也许正是因为如此,博主讲得细一点的话内容就会偏多啦,在学习的时候,因为知识很杂,所以整理知识点或内容排布不是很妥当,望指出!那我们就开始学习C++中的字符串复合类型,go!

1.数组

1.1C++的数组

  数组是一种数据格式,能够存储多个同类型的值,每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素

  创建数组的新知识:元素个数只能是常数表达式或const值

  数组是复合类型的原因是,数组是使用其它类型来创建的,我通常说arr是整型数组,浮点型数组,就是在强调数组是由什么其它类型创建的。我们并没有说arr是数组类型这一说法。

  有效下标值的重要性:编译器并不会检查下标的正确性,当我们下标因计算错误,超出了数组的范围后,并不会显性的提示错误,但我们运行时就会因破坏数据或代码而导致终止。

1.2C++数组初始化 

  补充:C++11将使用大括号{}的初始化(初始化列表)作为一种通用的初始化方式,可用于所有类型,前面也说过,也可以用{}给单值变量初始化。int a = {0};

*2.字符串

2.1字符串与数组

  先看一下下面的代码吧!

  看完后你就开始进入字符串的思维了(doge

字符串常量和字符常量表示什么? 

拼接字符串的详细过程补充:

   事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个字符串。

2.2字符数组的存储

  字符串常量在数组初始化的时候存进去或者通过cin对象输入字符串存到字符数组里去

  看到name2[3] = '\0';的时候,我们接下来cout<<name2;的时候,只显示出来前三个字符,因为索引值位3对应数组的第四个元素,我们在第四个元素主动放进斜杠0,提前结束了该字符串,而name2后面的其它字符oy是被我们忽略了的。

  注意:我在这个编译器的首行是有引用头文件#include <iostream>,我是有引才能用的cout和cin。不要因为我截图没截进来就以为不用引哈。

 2.3字符串输入cin

  字符串输入cin有一个缺陷,在上面的一个代码中巧妙的避开了,我们接下来的代码来了解cin的脾气。

   理解一个点:cin在遇到空白后,把空白也给拿走了,空白并不是存在字符数组里,而是丢弃掉了。随后把读取到的字符放进数组里并在结尾添了个'\0'

   还有一个问题存在的,这里的数组大小是20个,那最多只能存放19个,最后一个是'\0'才能保证是字符串,但,假如我们输入了一个30个字符的字符串,这能防止吗?答案是必须使用cin的较高级特性,就像是strncat限制一样。一个程序员心想写bug是拦不住的(doge)。

   那如何解决问题那,我的名字中间就是有空格呀,那我们就看到能读取一行的成员函数cin.getline()和cin.get()这两个函数都读取一行输入,直到到达换行符。而getline()将丢弃换行符,get()保留换行符在输入序列中。

2.4cin.getline()

每次读取一行字符串输入

  例如:假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以使用这样的函数调用。eg:cin.getline(name, 20); 

  这将把一行不超过19个字符(不包括换行符)的字符串存到name字符数组中,加上换行符最多20个字符。

  这里面名字有空格对于cin.getline()来说,不是行尾,只是一个字符' '(空格字符)而已。

  注意:它这里不需要>>来指明插入到哪个地方,在第一个参数的地方就说明了,所以cin.getline(name, 20);就可以啦

2.5cin.get()

面向行的输入:get()

  get()该函数有几种变体其中一种变体的工作方式和getline()类似,它们接收的参数相同,解释参数的方式也相同,并且都读取到行尾但与getline()不同的是get()并没有读取换行符而是留在了输入队列。

上面的代码输入如果用成cin.get(name, ArSize);

                                        cin.get(dessert, ArSize);

  我们会发现dessert里啥内容都没有,因为第一个里换行符留在了输入队列,第二个get()上来一读就是换行符,都到行尾了,一个内容都没有,所以dessert里啥也没有。那有解决办法吗?

  幸好get()还有一整变体,使用不带任何参数的cin.get()调用可读取下一个字符,和C语言里的getchar()读取一个字符一样,把输入缓冲区里的换行符给读走,让第二个cin.get(dessert, ArSize)停留在我们要输入的环节。

  所以把输入部分换成cin.get(name, ArSize); cin.get();cin.getline(dessert, ArSize);则与上面的代码一模一样。

  另一种使用方式:cin.get(name, ArSize).get(); 将两个类成员函数拼接起来,之所以可以这样做,是因为cin.get(name, ArSize)返回一个cin对象,该对象再次被用来调用成员函数。

  同样,cin.getline(name, ArSize).getline(dessert, ArSize);连续接收两行字符串输入,与两次调用getline()效果一样。

2.6函数重载例子

  C++允许函数有多个版本的条件是这些函数的参数列表不一样cin.get()编译器就知道是要读取一个字符,cin.get(字符数组, Size);编译器知道要读取Size个字符到数组中,相同函数,根据参数不同,功能不同,这就是函数重载

  get()和getline()使用哪个好?:首先,老式实现没有getline(),第二get()使输入结果更清晰,什么意思呢?当我们用get()来输入一行字符串后,我们再get()一次后,用一个字符变量接收第二次get()的内容,如果这个字符是换行符,那就说明读取了一整行后最后只剩下了一个换行,get()完整得读取了一行,若不是换行符,则说明该行还有其它输入内容,没有读取一整行

2.7混合输入数字和字符串

  在输入数值时,换行符会留下的。

  总结getline()和get()对于空字符的赋予:getline读掉换行符,将换行符替换成空字符赋给数组

get()留下换行符,并直接为数组添上空字符,它们的读取结束标志是换行符

  string类请见下回!!

  希望大家看完有所收获,也希望大家能喜欢我的博客。你的点赞是我更新的动力,欢迎指出文章描述不正确的或排版或内容分布的问题,博主会根据情况更改,一起努力把!

  求点赞,求点赞,求点赞!(flower)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283796.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zooker配置与测试

目录 1.介绍 2.配置 1.配置准备 2.配置修改 3.测试 1.介绍 2.配置 1.配置准备 zookeeper官网:Apache ZooKeeper &#xff08;1&#xff09;安装 JDK &#xff08;2&#xff09;拷贝 apache-zookeeper-3.5.7-bin.tar.gz 安装包到software目录下 &#xff08;3&#xff09;解…

mysql常用的基础命令

通过学习mysql命令提高数据处理和工作效率 基础命令 1.登录MySQL mysql -u root -p 2.查看当前系统所有数据库 show databases; 3.切换数据库 use 数据库名称 4.查看数据库下的所有表 show tables; 5.查看表结构&#xff1b; desc 表名&#xff1b; 6.创建数据库 crea…

CentOS7的下载、安装和配置(详细图解)

CentOS7安装包的下载 Centos7的安装包可以去官网&#xff08;https://www.centos.org/&#xff09;下载&#xff0c;但速度比较慢。 也可以用搜索引擎搜索国内镜像站点的安装包文件与官网同步&#xff0c;下载的速度非常快。 CentOS7软件安装包的分享 百度网盘分享&#xff…

python函数详解_INDEX函数

一. 函数的作用 函数就是将一段具有独立功能的代码块 整合到一个整体并命名&#xff0c;在需要的位置调用这个名称即可完成对应的需求。 函数在开发过程中&#xff0c;可以更高效的实现代码重用。 二. 函数的使用步骤 1. 定义函数 def 函数名(参数):代码1代码2...... 复制 …

usb_cam相机录制rosbag

文章目录运行环境&#xff1a;1.1 usb_cam连接&#xff1a;1.2 usb-cam启动1.2 查看相机话题名称2.1 rosbag录制2.2 播放rosbag运行环境&#xff1a; ubuntu20.04 noetic 杰瑞微通usb_cam&#xff08;分辨率640x480&#xff09; 宏基暗影骑士笔记本 1.1 usb_cam连接&#xff…

Golang每日一练(leetDay0030)

目录 88. 合并两个有序数组 Merge Sorted Array &#x1f31f; 89. 格雷编码 Gray Code &#x1f31f;&#x1f31f; 90. 子集 II Subsets II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

Linux复习 / 进程控制QA梳理

文章目录前言Q&A进程终止Q&#xff1a;exit和_exit的区别&#xff1f;Q&#xff1a;内核是如何终止进程的&#xff1f;进程等待Q&#xff1a;为什么要等待子进程&#xff1f;Q&#xff1a;如何等待子进程&#xff08;wait/waitpid的区别&#xff09;&#xff1f;进程替换Q&…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

【Linux】环境变量进程虚拟地址空间

环境变量&进程虚拟地址空间环境变量一些常见的环境变量-PATH修改环境变量进程虚拟地址空间环境变量 使用ls man pwd cd echo 这些指令时&#xff0c;不需要加./但是要运行我们自己的可执行程序就需要加上&#xff0c;本质上两个都是指令&#xff0c;为什么执行方法不同&am…

python学习之http客户端和服务端

Part1前言python非常简洁&#xff0c;非常适合写小功能以及测试接口。本文主要记录用pyhon实现一个简单的http客户端和服务端。Part2http客户端这里采用request库来实现。示例如下import requests import json url http://127.0.0.1:81/test?key1123&key2456headers {Au…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体&#xff0c;但程序、代码相对普通人而言&#xff0c;看着还是比较深奥难懂&#xff0c;但自从有了ChatGPT&#xff0c;不少对此有兴趣的外行人士&#xff0c;也能轻松写出代码了&#xff0c;比如让ChatGPT写一个贪吃蛇游戏&#xff0c;按它给出的…

【如何使用Arduino控制WS2812B可单独寻址的LED】

【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …

ROS实践05 订阅方实现Python

文章目录运行环境&#xff1a;思路&#xff1a;1.1 Python代码实现1&#xff09;工作空间创建和编译2&#xff09;功能包创建和添加依赖3&#xff09;新建.py文件4&#xff09;修改CMakeList5&#xff09;运行节点运行环境&#xff1a; ubuntu20.04 noetic 宏基暗影骑士笔记本…

Java每日一练(20230409)

目录 1. 多数元素 &#x1f31f; 2. 反转链表 II &#x1f31f;&#x1f31f; 3. 日期之间的遍历 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 多数元素 给定一个…

使用红黑树封装map和set

目录 一、set和map的底层结构 使用模板区分map和set 使用仿函数来比较大小 二、红黑树中set和map的迭代器 end和begin迭代器 operator迭代器 operator-- 三、set与map中的迭代器和const迭代器 四、迭代器的拷贝构造 五、完整代码 set.h map.h RBTree.h 一、set和ma…

UE4 C++编写自定义动画蓝图节点

UE中自带的动画蓝图节点有限&#xff0c;在实现一些功能时需要通过C编写一些自定义的动画蓝图节点&#xff0c;本文就来讲解其基础实现&#xff0c;自定义节点最终效果如下&#xff1a; 源文件下载&#xff1a;https://download.csdn.net/download/grayrail/87654290 1.流程简…

linux 服务器 docker 安装 mysql 8.0.32 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/_/mysql/tags 1.版本号可不写 不写就是最新版本 最好写上 docker pull mysql:版本号2.查看镜像是否安装成功 如下图 docker images3.创建文件…

活动送票福利|Jina AI x PyCon US 2023!

作为一家总部位于德国柏林的国际化公司&#xff0c;Jina AI 拥有来自 10 不同国家的团队成员&#xff0c;在中国&#xff08;北京、深圳&#xff09;、美国&#xff08;圣何塞&#xff09;均设有办公室。全球化基因深植于 Jina AI 团队&#xff0c;我们也非常注重国际化社区的建…

shardingsphere-jdbc 整合 springboot

shardingsphere官网地址 https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/ 当前我们演示的是水平分表 1、基础环境配置以及依赖管理 1.1 创建数据库表结构 CREATE TABLE address_0 (id bigint(…

linux 服务器 docker 安装 jdk jre java 1.8 环境 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker jdk 镜像 https://hub.docker.com/_/java/tags 1.下载JDK镜像 注&#xff1a;后面如果不写版本的话 就是最新版 建议写上 docker pull java:8u111-jdk2.查看镜像是否下载成功 docker…