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

news2024/11/19 4:33: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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考中级工程师笔记(持续更新)

进制 正负0 -0原000110010000 1000反000111100000 1111补000111110000 0000 取值范围 原 -(2n-1)-1~(2n-1)-1 数量 [(2n-1)-1]-[-(2n-1)-1] 1(1代表0)(2*2n-1)-1**2n-1** 反 -(2n-1)-1~(2n-1)-1 数量 [(2n-1)-1]-[-(2n-1)-1] 1(1代表0)(2*2n-1)-1**2n-1** 补 -(2n-1)~(2n-…

算法设计 || 实验一 用分治法实现元素的归并与检索 (头歌详解+本题分析笔记)

目录 &#xff08;一&#xff09;递归与分治是个啥&#xff1f; 1.递归&#xff08;归并排序&#xff09; 2.分治&#xff08;二分检索算法&#xff09; &#xff08;二&#xff09;头歌代码怎么写&#xff1f; &#xff08;三&#xff09;代码部分详解&#xff1a; &…

Android内嵌Unity (Activity)

Unity2019.4.4 AndropidStudio4.2.1 参考文档&#xff1a; Android内嵌Unity并实现互相跳转的实例代码_Android_脚本之家 Android Fragment中加载,嵌套Unity视图_unity 导入并作为fragment_周灬浩的博客-CSDN博客 本文只实现了Activity整个切换过去&#xff0c;而Fragment…

WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题)

​ 利用python脚本解决wsl2 ip不固定的问题 环境信息 ​ wsl2 中linux版本&#xff1a;ubuntu ​ windows版本&#xff1a; win10/win11 问题描述 最近装了wsl2&#xff0c;使用vscode远程连接wsl2时遇到了如下问题&#xff1a; 1、wsl2的ip无法固定 2、wsl2的ssh服务不能…

vue项目使用element-ui

最近新建一个vue项目&#xff0c;配置了element-ui&#xff0c;较之前使用时发生了些许变化&#xff0c;对新的配置方式进行记录 node版本 v14.21.3 npm版本 v6.14.18 vue版本 v2.6.14 element-ui版本 v2.15.13 创建项目vue项目&#xff0c;使用…

设计原则之【迪米特法则】

文章目录 一、什么是迪米特法则1、理解迪米特法则2、如何理解“高内聚、松耦合”&#xff1f; 二、实例1、实例12、实例2 一、什么是迪米特法则 迪米特原则&#xff08;Law of Demeter LoD&#xff09;是指一个对象应该对其他对象保持最少的了解&#xff0c;又叫最少知道原则&…

Navicat自动提交的开和关

使用Navicat时&#xff0c;若是自动提交是打开状态&#xff0c;就相当于是自动执行了commit操作&#xff0c;就无法进行回滚操作。 一.相关指令 1.查询Navicat的自动提交开关状态&#xff1a; -- 查询自动提交 ON:是自动提交&#xff0c;即commit ;OFF:不是自动提交&#xf…

Java-注解

文章目录 前言一、概述二、元注解TargetRetentionDocumentedInherited 三、自定义注解四、常用内置注解OverrideDeprecatedSuppressWarnings 前言 注解用于修饰包、类、方法、属性、构造器、局部变量等数据信息&#xff0c;它可以用于创建文档&#xff0c;跟踪代码的依赖性&am…

怎么在VMware ESXi添加NAS存储?

案例&#xff1a;需要将NAS添加到VMware ESXi “我的本地空间不是很多&#xff0c;虚拟机占了我很多空间&#xff0c;但是我有一个NAS&#xff0c;所以我想问一下有没有办法可以让VMware ESXi添加NAS存储来扩展空间&#xff1f;” 网络附加存储&#xff08;NAS&#xff09;设…

2023年6月CDGP数据治理专家认证考试,5月报名及学习

目前6月DAMA-CDGP数据治理专家认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; DAMA认证为数据…

为什么每个有影响力的内容创作者都需要一个Kadence WordPress网站

创作者经济正在蓬勃发展&#xff0c;内容创作者正在以前所未有的方式建立受众和收入来源。无论您是在 YouTube、Instagram、TikTok 还是任何其他平台上增加受众&#xff0c;充分利用这些受众变得越来越重要。 Adobe 于 2022 年 8 月发布的一项研究表明&#xff0c;过去 2 年全…

关于加强珠宝玉石类小程序把控的公告

各位小程序开发者为进一步加强小程序的规范管理&#xff0c;保障用户合法权益&#xff0c;平台将对珠宝玉石类小程序加强把控&#xff0c;具体内容如下&#xff1a; 一、 【商家自营-珠宝玉石】类目资质调整 备注&#xff1a;若小程序涉及经营随形加工的原石或摆件相关服务&…

Vue入门简介【第一篇】

大纲 一、Vue介绍 &#x1f334; 1.1 什么是Vue vue是一个构建用户界面UI的渐进式javascript框架&#xff0c;渐进式的框架是指可以一步一步的由浅入深的去使用该框架。 vue官网&#xff1a; https://cn.vuejs.org/ &#x1f334; 1.2 Vue的优点 ⭐️ 1、体积小 压缩后33…

大数据分析就业班课程大纲

大数据分析就业班课程大纲列举&#xff1a; 第一阶段 Mysql从入门到精通/Python从入门到精通课程模块课程内容 MySQL 数据库 数据库概念及其功能介绍、数据库的安装与配置、数据库表的创建及注意事项、数据库的增、删、改、查等操作、多表的关系及查询、多表的…

OSI七层模型中的MAC和PHY

最近做服务器项目在学习MAC和PHY&#xff0c;总结了一些知识点&#xff0c;拿来分享一下 说到MAC和PHY首先要提到OSI七层模型 OSI七层模型 TCP/IP四层模型 对应网络协议 应用层&#xff08;Application&#xff09; 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP 表示层&…

【Python入门知识】NumPy 数组排序/过滤,案例+理论讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组排序 排序是指将元素按有序顺序排列。 有序序列是拥有与元素相对应的顺序的任何序列&#xff0c;例如数字或字母、升序或降序。 NumPy ndarray 对象有一个名为 sort() 的函数&#xff0c;该函数将对指定的数组进行排…

功率放大器在Lamb波信号波包模型验证研究中的应用

实验名称&#xff1a;窄带激励条件下的兰姆波时域信号参数估计研究 研究方向&#xff1a;Lamb波 测试目的&#xff1a; 基于Lamb波的二阶频散理论&#xff0c;提出了时域信号的波包模型&#xff0c;为全文奠定理论基础。模型考虑两种情况&#xff1a;初始激励以单模态传播和…

【面试】说说什么是 Java 内存模型(JMM)?

文章目录 一、 为什么要有内存模型&#xff1f;1.1. 硬件内存架构1.2. 缓存一致性问题1.3. 处理器优化和指令重排序 二、并发编程的问题三、Java 内存模型3.1. Java 运行时内存区域与硬件内存的关系3.2. Java 线程与主内存的关系3.3. 线程间通信 四、总结 一、 为什么要有内存模…

Java阶段二Day16

Java阶段二Day16 文章目录 Java阶段二Day16SSMSpringBoot简述核心特性创建SpringBoot工程创建工程失败排查 MyBatis框架-注解管理概述MyBatis环境初始化整合MyBatisPojo对象设计Dao接口设计 SSM Spring&#xff1a;Spring是一个轻量级的容器和框架&#xff0c;为开发者提供了一…

沃通“SSL证书+代码签名证书”,防范高仿“钓鱼网站+钓鱼软件”攻击

近日&#xff0c;360发布威胁预警&#xff0c;因监测发现多起利用钓鱼网站对特定用户进行攻击的安全事件&#xff0c;呼吁警惕“高仿”软件安装程序暗藏钓鱼木马。“钓鱼网站钓鱼软件”是非常典型的钓鱼攻击组合&#xff0c;而沃通“SSL证书代码签名证书”能够帮助企业建立安全…