当前位置: 首页 > news >正文

C++学习day--08 数组和字符串

1、什么是数组

数组,就是多个元素的有序“组合”。
C 和 C++语言中的数组:
1 )由多个大小相同的小柜子组成 => 相同大小的内存块组成,即相同类型的数据
2 )这些小柜子,有自己对应的编号 => 编号从 0 开始递增
3 )而且这些编号是递增顺序。
数组的“容量”是不能改变的。
学过数据结构的都知道,数组有静态分配和动 态分配,动态分配可以改变容量。

 数组的定义

数组和其他变量一样,需要先定义,再使用。
实例:
int a[8];
// 定义了一个数组,
// 数组名是“a”,
// 包含 8 个元素,
// 每个元素是 int 类型的变量
a[0] = 20;
a[1] = 5;
说明:
定义了如下数组:
int a[8];
就相当于定义了 8 int 类型的变量
而且这 8 个变量是连续存储在内存中的。(8 个依次相连的邻居)
实例:
某渣男,想要记录他 10 个女友的身高,可以定义如下:
float girlFirends[8];
girlFirends[5] = 1.78;
int ages[50];
ages[0] = 18;
ages[49] = 19;
数组的初始化
在定义数组的同时,设置数组内的元素值。
int a[8] = {20, 5, 30, 13, 18};
printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]);
或者
cout << a[0] << “,” << a[1] << “,” << a[2] << “,” << a[3] << “,” << a[4];
int a[8] = {0}; //把数组的所有元素都初始化为 0
printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]);// 这种方式你得清楚是所有元素都置为0
int a[8] = {1}; // 把 a[0]初始化为 1,其它值都初始化为 0
int b[8] = {1, 5}; // 把 a[0]初始化为 1,a[1]初始化为 5,其它值都初始化为 0,不要以为后面的元素是其它值哦!!
int a[] = {1,2,5}; // 定义数组 a, 这个数组包含 3 个元素!
// 根据“初始化列表”,自动计算数组的容量
高逼格用法(在某些特殊场合使用)
优点:但数组的成员较多时,该方式可读性高
缺点:仅仅 C 编译器支持, C++ 编译器中不支持,即 C++ 程序中不能使用。
// 每周的锻炼时间:
int exercises[7] = {
[1] = 1, //a[1] = 1
[3] = 2, //a[3] = 2
// 没有指定的成员,被初始化为 0
};
不是连续方式赋值,只有C 编译器支持, c++ 编译器不支持这种方式,不建议这样使用,但是要知道这种赋值方式,以后开发不建议用这种赋值方式。
常见错误
int a[2] = {1,2,5}; //错误!初始值太多,大于数组的容量
int a[3];
a = {1, 2, 3}; //不能对数组名直接赋值!
int a[3];
a[3] = 10; //下标越界!下标的取值范围是 0, 1, 2

 数组元素的访问

通过下标访问对应的元素。

特别注意, 数组的第一个元素的下标是 0, 而不是 1
int girlSize[10];
a[5] = 38;
printf(“%d\n”, a[5]);
cout << a[5];
另类用法:
使用下标的方式访问 string 字符串
string name = "Rock";
//name[i]是 string 字符串中的第 i 个字符(char 类型)
for (int i=0; i< name.length(); i++) {
cout << name[i];
}
name[0] = 'L'; //name 变成:Lock
cout << endl << name;
name 虽然不是数组,但是可以通过数组的形式来访问字符串。重点哦!

数组的越界
数组的越界, 是指下标超出正常的范围!
例如:
int a[10]; //a[-1] a[10] 都是越界!
越界的后果
越界非常危险,可能导致数据破坏,或其他不可预期的后果!
越界的控制
需要程序员自己手动控制,编译器不做任何检查!因为, C/C++ 语言完全信任程序员!

2、C 风格的字符串详解

C 语言字符串的存储、初始化
字符串,是通过“字符数组” ( 元素类型为 char 的数组)来存储的!
demo1

char name[10];
name[0] = 'R';
name[1] = 'o';
name[2] = 'c';
name[3] = 'k';
name[4] = 0; //字符串结束符 0,就是 '\0'
printf(" 姓名: %s", name); //姓名: Rock
name[2] = 0;
printf(" 姓名: %s", name); //姓名:Ro

 demo2

char name[10] = "Rock"; // 相当于 char name[10] = {'R', 'o', 'c', 'k', ' \0 '};
printf(" 姓名: %s", name);

 demo3

char name[] = "Rock"; //相当于:name[5] = "Rock"

printf("%d", sizeof(name)); //5

C 语言字符串的输入输出 

#include <stdio.h>
#include <Windows.h>
int main( void ) {
char name[16];
char addr[64];
printf( " 姑娘芳名 ?\n" );
scanf( "%s" , name);
// 此时输入缓冲区中还有一个回车符
// 清空输入缓冲区
fflush(stdin);// 有些编译器不支持这个用法
printf( " 姑娘家住何地 ?\n" );
gets(addr); // 读一行,包括一行中的空格
printf( " 家住 %s %s, 我中意你 !\n" , addr, name);
system( "pause" );
return 0;
}

 3、计算机英语加油站

string
字符串
length
长度
scanf
C 语言的标准输入函数
parameter
参数
return value
返回值
str on success, NULL on failure.
如果成功,就是 str
如果失败,就是 NULL

4、常见错误总结

错误 1
cin.sync() VS 中失效 !
C++ 的标准中 , cin.sync() 是清空缓冲区 , 但是实际的实现取决于编译器.
如果使用 vc++ 或者 g++ 编译器 , 是可以的 , 但是使用 vs 中的编译器 , 就不可以 .
使用自定义的 clearBuff();
#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;
void clearBuff() {
char tmp;
while ((tmp = getchar()) != '\n' );
}
int main( void ) {
int age = 0;
int height =
0;
//身高, 单位:cm
cout << "请输入年龄: " << endl;
cin >> age;

if (cin.fail()) {
cout << "输入失败,应该输入一个整数" << endl;
cin.clear();
//cin.sync();
clearBuff();
}
cout << "请输入身高: " << endl;
cin >> height;
cout << "年龄: " << age << endl;
cout << "身高:" << height << endl;
system( "pause" );
return 0;
}
cin.sync() VS 编译器中失效,VS 编译器不支持这种用法,但不能说VS编译器不好。它是公认最好的开发平台。

错误 2
int a[3];
a = {1, 2, 3}; //错误
a[3] = 100;
错误 3
string s;
s = 3.14 * 100 * 100;//赋值的数据类型和定义的变量的类型不一致
int name[32];
scanf(“%s”, name);//整数不能用字符串的格式输入
注意:
string c++ 特有的一种数据类型,不能用C 语言的 scanf 来输入数据。会出现编译器警告。

5、职场修炼:技术和领导关系哪个更重要

1. IT 研发职场中,不要过分依赖领导关系。
2. 要与领导保持积极主动的沟通关系,闷头苦干会丢失很多机会。
3. 技术上,要尽快掌握公司的核心开发业务。
补充:一切关系,都是以个人的价值为基础的。

 6、逼格提升:解决 Bug 的第 1 手段-断点调试

问题代码:
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;

int main(void)

{
float r;
float s;
cout << " 请输入圆的半径: " ;
scanf( "%f" , r);
s = 3.14 * r * r;
cout << " 面积是: " << s << endl;
system( "pause" );
return 0;
}

你发现问题所在的地方了吗??答案(缺少地址符&) 

练习1:

连续读入多个单词,然后统计这些单词的总的长度、以及单词个数。 直到输入结束: (按下 Ctrl +z, 就会输入一个特殊的字符:文件结束符 EOF ) ,分别使用 C C++ 实现。
C++ 版本
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main( void ) {
string word;
int count = 0;
int length = 0;
cout << " 请输入任意多个单词: " ;
while (1) {
// 输入成功时,返回 cin 对象本身
// 遇到文件结束符(
ctrl+z ),而导致输入失败是,返回 0
if ((cin >> word) == 0) {
break ;
}
count++;
length += word.length();
}
cout << " 一共有 " << count << " 单词 " << endl;
cout << " 总长度: " << length << endl;

system( "pause" );
return 0;
}

 C 语言版本

#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main( void ) {
char word[64];
int count = 0;
int length = 0;
printf( " 请输入任意多个单词: " );
while (1) {
// 输入失败 返回 0
// 遇到文件结束符 (
ctrl+z ),返回 -1 EOF
if (scanf( "%s" , word) == -1) {
break ;
}
count++;
length += strlen(word);
}
printf( " 一共有 %d 个单词 \n" , count);
printf( " 总长度: %d\n" , length);
system( "pause" );
return 0;
}
练习 2
连续输入多行字符串(文本),统计中的行数,以及字符个数。
分别使用 C C++ 实现

 C 语言版本:

#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main( void ) {
char line[2048];
int lineCount = 0;
int length = 0;
printf( " 请输入任意多行: " );

while (1) {
if ( gets(line) == 0) {
break ;
}
lineCount++;
length += strlen(line);
}
printf( " 一共有 %d \n" , lineCount);
printf( " 总长度: %d\n" , length);
system( "pause" );
return 0;
}

C++版本:

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main( void ) {
string line;
int lineCount = 0;
int length = 0;
cout << " 请输入任意多行: " ;
while (1) {
// 遇到文件结束符时, 返回 NULL 0
if (getline(cin, line) == 0) {
break ;
}
lineCount++;
length += line.length();
}
cout << " 一共有 " << lineCount << " " << endl;
cout << " 总长度 : " << length << endl;
system( "pause" );
return 0;
}

相关文章:

C++学习day--08 数组和字符串

1、什么是数组 数组&#xff0c;就是多个元素的有序“组合”。 C 和 C语言中的数组&#xff1a; 1 &#xff09;由多个大小相同的小柜子组成 > 相同大小的内存块组成&#xff0c;即相同类型的数据 2 &#xff09;这些小柜子&#xff0c;有自己对应的编号 > 编号从 …...

系统分析师之系统测试与维护(十六)

目录 一、 测试与评审 1.1 测试类型 1.2 测试阶段 1.3 面向对象的测试 1.4 测试自动化 1.5 软件调试 1.6 软件评审 1.7 验收与确认 二、软件质量管理 2.1 软件过程改进-CMMI 2.2 软件开发环境与工具 三、系统运行与评价 3.1 系统转换计划 3.1.1 遗留系统演化策略…...

板材激光切割机切割穿孔时注意的几个问题

激光切割设备广泛应用于钣金、五金制品、钢结构、汽车配件、广告、工艺品等行业&#xff0c;成为加工行业不可缺少的环节。在厚板加工中穿孔时间占很大比重&#xff0c;随着加工板材越来越厚&#xff0c;板材激光切割机切割穿孔也会相应地增加难度。 激光切割机两种常见的穿孔方…...

奶爸式Swagger教学

目录 一、导入依赖 二、SwaggerConfig基础编程 三、Swagger 常用说明注解 1.API 2.ApiOperation 3.ApiModel 4.ApiModelProperty 5.ApiParam 6.ApilmplicitParam 一、导入依赖 <!--开启Swagger --><!-- https://mvnrepository.com/artifact/io.springf…...

入门级的家用洗地机怎么样?入门级洗地机推荐

洗地机的功能有很多&#xff0c;比如除菌、洗地机清洁地面的确是一把好手。但是&#xff01;清洁完之后还要手动清洗洗地机&#xff0c;是一件麻烦事啊&#xff01;现在市面上大部分洗地机都有自清洁这个功能&#xff0c;但是很多洗地机的自清洁并不算真正的自清洁&#xff0c;…...

【面试】Java 反射机制(常见面试题)

文章目录 前言一、反射是什么&#xff1f;二、为什么要有反射三、反射 API3.1 获取 Class 对象的三种方式3.2 获取成员变量3.3 获取构造方法3.4.获取非构造方法 四、实践五、常见面试题5.1. 什么是反射&#xff1f;5.2. 哪里用到反射机制&#xff1f;5.3. 什么叫对象序列化&…...

JavaScript最佳实践

JavaScript最佳实践 2023.5.8版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 JavaScript 是一种动态编程语言&#xff0c;可让开发者创建动态和交互式 Web 应用程序。然而&#xff0c;编写 JavaScript 代码比较具有挑战性&#xff0c;尤其…...

景23转债,海能转债上市价格预测

景23转债 基本信息 转债名称&#xff1a;景23转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;11.54亿元。 正股名称&#xff1a;景旺电子&#xff0c;今日收盘价&#xff1a;22.52元&#xff0c;转股价格&#xff1a;25.71元。 当前转股价值 转债面值 / …...

TDengine 部署与使用----时序数据库

官网 通过 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 docker安装 拉取最新docker镜像 docker pull tdengine/tdengine:latest 然后执行 docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine 查看容器…...

ShardingSphere系列四(Sharding-JDBC内核原理及核心源码解析)

文章目录 1. ShardingSphere内核解析1.1 解析引擎1.2 路由引擎1.3 改写引擎1.4 执行引擎1.5 归并引擎 2. ShardingSphere的SPI扩展点2.1 SPI机制2.2 ShardingSphere中的SPI扩展点2.3 实现自定义主键生成策略 3. ShardingSphere源码 1. ShardingSphere内核解析 ShardingSphere虽…...

【2023】华为OD机试真题全语言-题目0234-字符串重新排列

题目0234-字符串重新排列 题目描述 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 单词内部调整:对每个单词字母重新按字典序排序单词间顺序调整: 统计每个单词出现的次数,并按次数降序排列次数相同,按单词长度升序排列次数和单词长度均相同…...

Springboot +Flowable,三种常见网关的使用(排他、并行、包容网关)(一)

一.简介 Flowable 中常用的网关主要有三种类型&#xff0c;分别是&#xff1a; 排他网关并行网关包容网关 下面来说下这三种的网关的概念和用法。 二.排他网关 排他网关&#xff0c;也叫互斥网关&#xff0c;截图如下&#xff1a; 排他网关有一个入口&#xff0c;多个有效…...

软考高项(一)信息化发展 ★重点集萃★

1、信息是确定性的增加。信息不是物质&#xff0c;也不是能力。 2、信息的特征与质量&#xff0c;主要包括&#xff1a;客观性、普遍性、无限性、动态性、相对性、依附性、变换性、传递性、层次性、系统性和转化性等。 3、信息的质量属性&#xff0c;主要包括&#xff1a;精确…...

大项目准备(2)

目录 中国十大最具发展潜力城市 docker是什么&#xff1f;能介绍一下吗&#xff1f; 中国十大最具发展潜力城市 按照人随产业走、产业决定城市兴衰、规模经济和交通成本等区位因素决定产业布局的基本逻辑&#xff0c;我们在《中国城市发展潜力排名&#xff1a;2022》研究报告…...

计算机网络【2】 子网掩码

学习大佬记下的笔记 https://zhuanlan.zhihu.com/p/163119376 "子网"掩码&#xff0c;顾名思义&#xff0c;它就是拿来划分子网的&#xff0c;更准确的说&#xff0c;划分子网的同时&#xff0c;还能通过它知道主机在子网里面的具体ip的具体地址。 子网掩码只有一个…...

linux发行家族和发行版及安装软件方式

在Linux平台下&#xff0c;软件包的类型可以划分为两类&#xff1a;源码包、二进制包&#xff1b; 一个软件要在Linux上执行&#xff0c;必须是二进制文件&#xff1b; 源码包&#xff1a;即程序软件的源代码&#xff08;一般也叫Tarball&#xff0c;即将软件的源码以tar打包后…...

FE_Vue学习笔记 条件渲染[v-show v-if] 列表渲染[v-for] 列表过滤 列表排序

1 条件渲染 v-show v-if 使用template可以使其里面的内容在html的结构中不变。条件渲染&#xff1a; v-if 1&#xff09;v-if“表达式” 2&#xff09;v-else-if“表达式” 3&#xff09;v-else {} 适用于&#xff1a;切换频率较低的场景。特点&#xff1a;不展示的DOM元素直…...

基于C++实现旅行线路设计

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 系统根据风险评估&#xff0c;为旅客设计一条符合旅行策略的旅行线路并输出&#xff0c;系统能查询当前时刻旅客所处的地点和状态&#xff08;停留城市/所在交通工具&#xff09;。 实验内容和实验环境描述 1.1 实验内容 城…...

Lenovo m93 mini 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo m93 mini 处理器Intel i5-4590T 2.20GHz (35w) 4-core/4-thread已驱动 内存8GB (2x4) DDR3 1600MHz已驱动 硬盘2.5" SSD Samsung 8…...

【论文阅读】COPA:验证针对中毒攻击的离线强化学习的稳健策略

COPA: Certifying Robust Policies for Offline Reinforcement Learning against Poisoning Attacks 作者&#xff1a;Fan Wu, Linyi Li, Chejian Xu 发表会议&#xff1a;2022ICRL 摘要 目前强化学习完成任务的水平已经和人类相接近&#xff0c;因此研究人员的目光开始转向…...

Java笔记_18(IO流)

Java笔记_18 一、IO流1.1、IO流的概述1.2、IO流的体系1.3、字节输出流基本用法1.4、字节输入流基本用法1.5、文件拷贝1.6、IO流中不同JDK版本捕获异常的方式 二、字符集2.1、GBK、ASCII字符集2.2、Unicode字符集2.3、为什么会有乱码2.4、Java中编码和解码的代码实现2.5、字符输…...

前端vue3一键打包发布

一键打包发布可以分为两种&#xff0c;一是本地代码&#xff0c;编译打包后发布至服务器&#xff0c;二是直接在服务器上拉去代码打包发布至指定目录中。 两种各有使用场景&#xff0c;第一种是前端开发自己调试发布用的比较多&#xff0c;第二种是测试或者其他人员用的多&…...

13 | visual studio与Qt的结合

1 前提 Qt 5.15.2 visual studio 2019 vsaddin 2.8 2 具体操作 2.1 visual studio tool 2.1.1 下载 https://visualstudio.microsoft.com/zh-hans/downloads/2.1.2 安装 开发...

纯手动搭建大数据集群架构_记录019_集群机器硬盘爆满了_从搭建虚拟机开始_做个200G的虚拟机---大数据之Hadoop3.x工作笔记0179

今天突然就发现,使用nifi的时候集群满了...气死了.. 而在vmware中给centos去扩容,给根目录扩容,做的时候,弄了一天...最后还是报错, 算了从头搭建一个200G的,希望这次够用吧.后面再研究一下扩容的问题. 2023-05-12 11:06:48 原来的集群的机器,硬盘太小了,扩容不知道怎么回事…...

变量大小:—揭开不同类型的字节数

变量大小&#xff1a;一一揭开不同类型的字节数 在编程中&#xff0c;我们会使用各种类型的变量来存储数据&#xff0c;但是你是否知道这些变量在内存中所占用的字节数是多少呢&#xff1f;随着不同编程语言和不同的操作系统&#xff0c;这些变量的字节数可能会有所不同。在本…...

23.自定义指令

像是 v-if,v-for,v-model 这些是官方指令&#xff0c;vue允许开发者自定义指令 目录 1 mounted 1.1 基本使用 1.2 第一个形参 1.3 第二个形参 2 updated 3 函数简写 4 全局自定义指令 1 mounted 当指令绑定到元素身上的时候&#xff0c;就会自动触发mounted()…...

OPNET Modeler 例程——停等协议的建模和仿真

文章目录 一、概述二、链路模型和包格式创建三、进程模型1.src 进程模型2.sink 进程模型 四、节点模型五、网络模型六、仿真结果 一、概述 本例程是在 OPNET Modeler 中对停等协议的建模和仿真&#xff0c;其中停等协议的操作过程如下&#xff1a; &#xff08;1&#xff09;发…...

JavaScript - 基础+WebAPI(笔记)

前言&#xff1a; 求关注&#x1f62d; 本篇文章主要记录以下几部分&#xff1a; 基础&#xff1a; 输入输出语法&#xff1b;数据类型&#xff1b;运算符&#xff1b;流程控制 - 分支语句&#xff1b;流程控制 - 循环语句&#xff1b;数组 - 基础&#xff1b;函数 - 基础&…...

API调用的注意事项及好处!

API调用是指一个软件系统通过预定格式、协议和框架&#xff0c;向另一个软件系统发送请求并获得响应的过程。 在进行API调用时需要注意以下事项&#xff1a; 1. 认真阅读API文档&#xff1a;在调用API前&#xff0c;一定要认真仔细地阅读相关的API文档&#xff0c;了解API接口…...

ros2中常用命令,与ros1的区别

文章目录 1. ros1 中的rosrun tf tf_echo 在ros2中使用办法2. rqt 中 tf 树的查看3. roscd 在ros2中使用办法4. ros2获取时间的方法&#xff1a; 1. ros1 中的rosrun tf tf_echo 在ros2中使用办法 # ros2 run tf2_ros tf2_echo [reference_frame] [target_frame] ros2 run tf2…...