C++青少年简明教程:字符类型、字符数组和字符串

C++青少年简明教程:字符类型、字符数组和字符串

在 C++ 语言中,处理文本数据的基础是字符类型 char,字符数组,以及标凌库中的字符串类 std::string。

C++中的char类型占用 1 字节的内存空间,用于存储单个ASCII字符。例如,字符'A'在ASCII编码中对应的值是65。

字符数组是一个可以存储多个字符的连续内存空间。你可以使用字符数组来存储一个字符串(即一系列字符,以空字符'\0'结尾)。如:

char str[10] = "Hello"; // 注意,这里实际上存储了"Hello\0",即字符串后有一个空字符作为结束符

字符数组可以通过循环逐个访问其元素,但在处理时必须小心维护 '\0' 结束符,以防止出现越界错误。字符数组通常被称为 C-风格字符串(C-style strings)。这种字符串表示方式来源于 C 语言,在 C++ 中仍然被广泛支持,主要因为历史兼容性和操作系统接口的要求。

字符串类,在C++中,std::string是一个类,用于处理字符串。它是C++标准库中的一部分,提供了许多方便的方法来操作字符串,如连接、比较、查找等。使用 std::string 类可以大大简化字符串的操作,并提高代码的安全性和可读性。

字符类型

在C++中,字符类型使用关键字char来定义。字符类型表示单个字符,包括数字、字母、符号等。字符类型的大小是一个字节(8位)。

字符类型变量只能存储一个字符,例如:

char c = 'A'; // 定义字符类型变量c,存储值为'A'

注意使用字符类型数据确实使用单引号(' ')。

空字符的 ASCII 码值为 0,因此,可以使用以下语句来表示空字符:

char c = '\0';

字符数组

字符数组是由字符组成的一维数组,包含多个字符元素。字符数组也有一维、二维、三维之分。

一维字符数组

c++中,可以使用字符类型数组来存储多个字符。字符类型数组是由多个字符类型变量组成的有序集合,即一串字符。可以使用花括号和逗号分隔符来初始化字符类型数组,也可以使用双引号来初始化字符类型数组,这样可以更容易地输入一串字符,而无需逐个输入每个字符。例如:

char str1[] = {'H', 'e', 'l', 'l', 'o'}; // 定义字符类型数组str1,但不是一个字符串

char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 定义字符类型数组str2,并且是一个字符串

char str3[] = "Hello"; // 定义并双引号进行初始化字符类型数组str3,并且是一个字符串

str2和str3是等价的。

字符类型数组可以用来存储字符串,字符数组以空字符('\0')作为结尾标识,表示字符串的结束。在使用双引号进行初始化时,编译器会自动在字符数组末尾添加一个空字符'\0',也就是说使用字符串字面值来初始化字符类型数组时,不需要明确地添加空字符。

一维字符数组和字符串的不同点:

1.字符串以空字符('\0')作为字符串的结束符,而字符数组没有特定的结束符。

2.字符串可以使用双引号("")来初始化,例如char str[] = "hello",而字符数组则需依次赋值,例如char arr[] = {'h', 'e', 'l', 'l', 'o'}或者char arr[] = "hello";(这种方式会在数组的末尾自动添加一个空字符)。

3.字符串可以使用一些针对字符串类型的函数,例如strlen()、strcpy()、strcmp()等等。字符数组也可以使用这些函数,但是需要对其具体的长度、空字符进行处理。

尽管字符数组可以用来处理字符串,但在C++中,通常推荐使用string类。

一维字符数组初始化

1.使用字符串字面值进行初始化:

char str[] = "Hello";

这会创建一个字符数组str,并将字符串字面值"Hello"复制到该数组中。注意,字符数组的大小会根据字符串的长度自动确定。

2.使用花括号初始化列表进行初始化:

char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};

这里使用花括号{}来指定字符数组的初始元素,包括最后一个null字符('\0')。

3.逐个赋值:

char str[6];
str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '\0';

这种方式需要逐个给字符数组的元素赋值,并确保最后一个元素是null字符('\0')。

4.使用strcpy函数进行赋值(需要包含头文件<cstring>):

char str[6];
strcpy(str, "Hello");

注意,无论使用哪种方式,都需要保证字符数组的容量足够大,能够容纳赋值的字符串。另外,字符串赋值时要确保最后一个字符是字符串的结尾符 '\0'即null字符。

一维字符数组和字符串(string)的关系

在C/C++中,字符串实际上是以字符数组的形式存储的,以null字符('\0')作为字符串的结束标志。因此,可以说字符串是字符数组的一种特殊情况。一维字符数组可以用于存储任意的字符序列,而字符串则是一个以null字符结尾的字符数组。

字符数组可以通过初始化或赋值来定义,而字符串只能通过初始化来定义。字符数组是定长的,而字符串长度可变。

注意,下面两句是有区别的:

char str[6] = {'H', 'e', 'l', 'l', 'o'};

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

都是合法的。

第一种写法定义了一个包含5个字符的字符数组,初始化为指定的字符序列,但没有明确指定空字符('\0')。如果将其作为字符串使用,可能会导致访问越界或其他错误。

第二种写法定义了一个包含5个字符和一个空字符的字符数组,并且明确地将最后一个元素设置为空字符('\0')。这样就确保了数组以空字符结尾,可以被正确地当作字符串来处理。

【顺便提示:C语言中只有一种方式来表示字符串,那就是使用C-style string的字符数组(char array)。

C++中处理字符串的两种都可以:

1.C-style string的字符数组(char array):使用字符数组来表示和处理字符串。字符数组以null字符 '\0' 结尾,可以使用C风格的字符串函数来进行操作。这种方式需要手动管理内存,并且对于较长的字符串长度可能会有限制。

2.使用 string 类型:C++标准库提供了 string 类型(std::string),它是一个类模板。可以通过包含 <string> 头文件来使用 string 类型。string 类型提供了许多方便的字符串操作方法,它为字符串的处理提供了更高级的抽象和功能。】

一维字符数组简单示例:

#include <iostream>
using namespace std;int main() {char str[] = "Hello, World!"; //长度自动确定cout << str << endl;  // 输出:Hello, World!return 0;
}

使用标准库函数printf、scanf、puts、gets等完成字符数组的输入输出需要引入<cstdio>头文件。该头文件是对<stdio.h>头文件的C++版本支持,其中包含了许多对输入输出操作有用的函数及变量。详情可参考 “C++的输入输出”一节。

★使用printf和scanf完成字符数组的输入输出:

#include <cstdio>int main() {char str[50];// 从标准输入读取一个字符串到字符数组中printf("请输入字符串:");scanf("%s", str);// 将字符数组的内容打印到标准输出中printf("您输入的字符串是:%s\n", str);return 0;
}

★使用puts和gets完成字符数组的输入输出

#include <cstdio>int main() {char str[50];// 从标准输入读取一个字符串到字符数组中printf("请输入字符串:");gets(str);// 将字符数组的内容打印到标准输出中puts("您输入的字符串是:");puts(str);return 0;
}

C++ 标准库提供了一些函数用来处理以 null 结尾的字符数组(C 风格字符串)。这些函数包括在 <cstring>(或 <string.h>)头文件中。常用的如:

strlen :用于返回指定字符串的长度(不包括空字符)。

strcpy :用于将一个字符串复制到另一个字符数组中。

strcat :用于将两个字符串进行拼接。

strcmp :用于比较两个字符串,并返回它们之间的区别。

strchr :用于在字符串中查找给定字符的第一个出现位置。

strstr :用于在字符串中查找给定字符串的第一个出现位置。

提示:这些函数需要引入 <cstring> (或 <string.h>)头文件。该头文件包含了 C++标准库中与C语言字符串操作相关的函数的声明。

#include <iostream>
#include <cstring>
using namespace std;int main() {// 定义两个C风格字符串char str1[] = "Hello, World!";char str2[] = "C++";// 使用strlen计算字符串长度int length1 = strlen(str1);int length2 = strlen(str2);cout << "字符串1长度: " << length1 << endl;cout << "字符串2长度: " << length2 << endl;// 使用strcpy复制字符串char str3[100];strcpy(str3, str1);cout << "复制后的字符串: " << str3 << endl;// 使用strcat拼接字符串char str4[100];strcpy(str4, str1);strcat(str4, ", ");strcat(str4, str2);cout << "拼接后的字符串: " << str4 << endl;// 使用strcmp比较字符串if (strcmp(str1, str2) == 0) {cout << "两个字符串相等" << endl;} else {cout << "两个字符串不相等" << endl;}// 使用strchr查找字符char* found = strchr(str1, 'W');if (found != nullptr) {cout << "找到字符: " << *found << endl;} else {cout << "未找到字符" << endl;}// 使用strstr查找字符串char* found2 = strstr(str1, str2);if (found2 != nullptr) {cout << "找到字符串: " << found2 << endl;} else {cout << "未找到字符串" << endl;}return 0;
}

运行输出:

字符串1长度: 13
字符串2长度: 3
复制后的字符串: Hello, World!
拼接后的字符串: Hello, World!, C++
两个字符串不相等
找到字符: W
未找到字符串

对于字符数组重点掌握一维字符数组,下面简要介绍二维字符数组。

二维字符数组最常见的初始化方式

1:逐个初始化

    char charArray1[2][3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};

2:使用字符串字面值初始化

    char charArray2[2][3] = {"ab", "cd"};

二维字符数组简单示例

#include <iostream>
using namespace std;int main() {// 二维字符数组char str[][10] = {"Hello", "World"}; // 大小为2x10cout << "str[0]: " << str[0] << endl;cout << "str[1]: " << str[1] << endl;return 0;
}

输出:

str[0]: Hello
str[1]: World

字符串类(std::string

一般推荐在 C++ 程序中使用 std::string 类来处理字符串,除非有特定的性能要求或者需要与旧的 C 代码库互操作。利用 std::string 提高开发效率和程序的安全性。

要使用 std::string 类,你需要引入的是 <string> 头文件。

在C++中,string类是标准库提供的字符串类,它在<string>头文件中定义。string类提供了一系列成员函数和操作符,用于处理和操作字符串。string不属于STL(Standard Template Library)中的容器类,而是C++标准库(Standard Library)中的一个类,用于表示和操作字符串。

你可以很方便地使用string类进行字符串的赋值、拼接、查找、替换等操作,而不需要手动管理内存或考虑字符串长度的限制。

赋值和拼接:可以使用=操作符进行字符串的赋值,也可以使用+操作符进行字符串的拼接。

访问字符:可以使用下标操作符[]来访问字符串中的单个字符,并可以修改它们。

字符串长度:使用length()或size()成员函数可以获取字符串的长度。

比较字符串:可以使用==、!=、<、>、<=、>=等操作符进行字符串的比较。

查找和替换:string类提供了find()、rfind()、replace()等成员函数,用于在字符串中查找指定的子串并进行替换。

【https://cplusplus.com/reference/string/string/ 】

可以使用不同的构造函数(constructor)【注:C++中,构造函数是一种特殊的成员函数,它在创建类的对象时被自动调用。构造函数的主要目的是初始化对象的数据成员】来创建不同的字符串。这些是一些常见的方法示例:

☆默认构造函数(无参构造函数):例如:

string str; //创建一个空的string对象。

string str = "Hello World!"; //创建一个的string对象并赋值初始化

☆带字符串参数的构造函数:创建一个string对象,并将其初始化为一个给定的字符串。例如:

string str("Hello");

☆带字符参数和个数的构造函数:创建一个string对象,并将其初始化为指定个数的相同字符。例如:

string str(5, 'a');  // str = "aaaaa"

☆拷贝构造函数:使用一个已有的string对象创建一个新的string对象。例如:

string str1("Hello");

string str2(str1);  // str2 = "Hello"

下面介绍string 类中提供的 getline 函数。

getline()函数语法如下:

istream& getline (istream& is, string& str, char delim);

其中,is是输入流对象;str是目标字符串对象;delim是可选参数,表示定界符(分隔符,默认为换行符)。

使用getline()函数时,它会从输入流中读取一行文本,并将读取到的内容存储到目标字符串str中,直到遇到定界符(或文件结尾)为止。如果指定了定界符delim,则getline()函数会在遇到该字符时停止读取,否则默认为换行符。

#include <iostream>
#include <string>
using namespace std;int main() {string str;cout << "请输入名字:";getline(cin, str);  //cin >> str;// 检查字符串是否为空if (str.empty()) {cout << "The string is empty." << endl;} else {cout << "The string is not empty." << endl;}return 0;
}

运行效果:

 特别说明:c++中,cin >> str 和 string类的getline(cin, str) 用来读取用户输入的两种不同方式的不同点:

数据类型不同:cin >> str是用来读取字符串类型的单个单词或数字型数据(整数、实数等),而getline(cin, str)则是用来读取整行的字符串。

分隔符:使用cin >> str时,输入被空白字符(如空格、制表符、换行符)分隔为不同的字符串,并将第一个非空白字符开始的连续字符序列存储到str中,剩余部分将会留在输入队列中;而getline(cin, str)则会读取整行输入,包括空白字符,在遇到换行符之前将其存储到str中。

输入限制:cin >> str只能读取到空白字符之前的内容,因此无法读取含有空格的字符串,一次只能读取一个单词或数字。而getline(cin, str)可以读取包含空格的完整行,因此可以读取多个单词或整行文本。

换行符处理:cin >> str读取后会将换行符留在输入流中,可以影响下一次读取操作。相比之下,getline(cin, str)会将换行符从输入流中移除,以防止影响后续读取操作。
【空白字符是指在文本中没有可见形式的字符,主要包括空格、制表符和换行符。它们在文本处理中具有不同的作用。

空格(Space):表示一个可见的空间,在文本中起到分隔单词或字符的作用。多个连续的空格会被视为一个空格。

制表符(Tab):通常用\t来表示,在文本中占据一个固定的宽度,经常用于对齐文本中的内容。

换行符(Newline):表示换行的特殊字符,在不同的操作系统中可能有不同的表示方式。在Unix和Linux系统中,换行符用\n表示;在Windows系统中,换行符由两个字符组成,即回车符(Carriage Return)和换行符,用\r\n表示。

这些空白字符在输入和输出操作中都需要注意处理。在C++中,空白字符通常用于分隔不同的数据项,而换行符用于标识一行的结束。了解和正确处理这些字符对于正确解析和处理用户输入以及生成正确格式的输出非常重要。】

2、演示了如何连接字符串、获取字符串长度、检查字符串是否为空、访问和修改字符串中的字符、查找子字符串的位置以及提取子字符串。您可以根据需要进一步使用std::string执行其他操作,例如插入、删除、比较等等。

#include <iostream>
#include <string>
using namespace std;int main() {string str1 = "Hello";string str2 = " world!";// 连接两个字符串string result = str1 + str2;cout << "Concatenated string: " << result << endl;// 获取字符串长度cout << "Length of the string: " << result.length() << endl;// 检查字符串是否为空if (result.empty()) {cout << "The string is empty." << endl;} else {cout << "The string is not empty." << endl;}// 访问字符串中的字符char c = result[0];cout << "First character of the string: " << c << endl;// 修改字符串中的字符result[0] = 'h';  // 将第一个字符修改为小写 'h'cout << "Modified string: " << result << endl;// 查找子字符串的位置size_t pos = result.find("world");if (pos != string::npos) {cout << "Substring 'world' found at position: " << pos << endl;} else {cout << "Substring not found." << endl;}// 提取子字符串string sub = result.substr(6, 5);  // 从位置 6 开始,提取长度为 5 的子字符串cout << "Substring: " << sub << endl;return 0;
}

你可以编译运行试试看。

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

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

相关文章

【动手学深度学习】卷积神经网络CNN的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 卷积神经网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 特征提取和模式识别&#xff1a;CNN 在计算机视觉领域被广泛用于提取图像…

C++ : 模板初阶

标题&#xff1a;C : 模板初阶 水墨不写bug 正文开始&#xff1a; C语言的问题 &#xff1a; 写不完的swap函数 在学习C语言时&#xff0c;我们有一个经常使用的函数swap函数&#xff0c;它可以将两个对象的值交换。 我们通常这样实现它&#xff1a; void swap(int t1,int t2)…

景源畅信数字:抖音直播人气品类有哪些?

随着短视频平台的兴起&#xff0c;抖音成为了人们日常生活中不可或缺的娱乐方式之一。而抖音直播作为平台的重要组成部分&#xff0c;吸引了大量的观众和主播参与。那么&#xff0c;在抖音直播中&#xff0c;哪些品类能够吸引更多的人气&#xff0c;成为观众们关注的焦点呢?接…

vs2019 c++20 规范 STL库中关于时间的模板 ratio<T,U> , duration<T,U> , time_point<T,U>等

(探讨一)在学习线程的时候&#xff0c;一些函数会让线程等待或睡眠一段时间。函数形参是时间单位&#xff0c;那么在 c 中是如何记录和表示时间的呢&#xff1f;以下给出模板简图&#xff1a; &#xff08;2 探讨二&#xff09;接着给出对模板类 duration_values 的成员函数的测…

python字符串的进阶

在上一篇文章的 密码破解器 中&#xff0c;我们回顾了循环专题的知识点。 while 循环和 for 循环是 Python 中的两大循环语句&#xff0c;它们都可以实现循环的功能&#xff0c;但在具体使用时略有差别。当循环次数不确定时&#xff0c;我们选用 while 循环&#xff1b;当循环…

高并发短视频系统设计:架构、存储与性能优化全解

1. 系统概况与需求分析 1.1 短视频系统简介 当前短视频行业的快速发展&#xff0c;加上用户对高清、流畅观看体验的需求不断提升&#xff0c;对系统的并发处理能力、视频处理速度、存储效率等多方面都提出了极高的要求。那么&#xff0c;我们首先需要了解一个完整的短视频系统…

【C++】list的使用(上)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于list&#x1f525;默认成员函数构造函数&#xff08;constructor&#xff09;析构函数&#xff08;destructor&#xff09;赋值运算符重载 &#x1…

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器&#xff0c;它们充当客户端和目标服务器之间的中介&#xff0c;但它们的工作方式和应用场景有所不同。 1. SOCKS 代理&#xff1a; 工作原理&#xff1a; SOCKS 代理是一种更底层的代理&#xff0c;…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段&#xff0c;区&#xff0c; 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件&#xff0c;主要用于存储记录、索引等数据&#xff0c;一个mysql实例可有多个表空间&#xff0c;甚至能通过innodb…

2024年度CCF-阿里云瑶池科研基金正式发布

2024年度CCF-阿里云瑶池科研基金正式发布 截止时间&#xff1a;2024年7月1日24:00&#xff08;北京时间&#xff09; 欢迎CCF会员积极申报 “CCF-阿里云瑶池科研基金”由CCF与阿里云计算有限公司于2024年联合设立&#xff0c;专注于数据库领域&#xff0c;旨在为领域学者提供…

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里&#xff0c;内容是王道。无论是视频还是文章&#xff0c;优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天&#xff0c;我为大家整理了一些优质的素材网站&#xff0c;帮助每一位自媒体创作者&#xff0c;无论新手还是老手&#xff0c;都能找到适…

nginx平滑升级

#平滑升级 kill -USR2 <PID号> //查看nginx版本 [rootl1 logs]# nginx -v //查看nginx版本 nginx version: nginx/1.26.0 [rootl1 logs]# 安装一个1.25版本实验一下 [rootl2 ~]# cd /opt/ [rootl2 opt]# [rootl2 opt]# lsnginx-1.25.5.tar.gz nginx-1.26.0.tar.…

Stable Diffusion: Lora篇

前面提到&#xff0c;在提示词中可以使用LoRA并设置权重。LoRA是Low-Rank Adaptation的简写&#xff0c;直译为轻量级微调&#xff0c;是一种通用的AI大模型微调技术&#xff0c;通过LoRA使用可以对Stable Diffusion模型输出进行微调型&#xff0c;更加随心所欲地实现定制华输出…

数据结构--双向链表

目录 一.链表的分类 二.双向链表的结构 三.双向链表的实现 1.初始化 2.尾插与头插 3.尾删与头删 4.在指定位置之后插入数据 查找函数 5.删除指定节点 6&#xff0c;销毁链表 四.完整代码 List.h List.c 一.链表的分类 链表的结构⾮常多样&#xff0c;以下情况组合起…

单列集合--ArryList、LinkedList、Set

使用IDEA进入某个类之后&#xff0c;按ctrlF12,或者alt数字7&#xff0c;可查看该实现类的大纲。 package exercise;import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.function.Consumer;public class Demo3 {public static void…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

基于三元组一致性学习的单目内窥镜里程计估计

文章目录 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope摘要方法实验结果 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope 摘要 单目图像中深度和姿态的估计对于计算机辅助导航至关重要。由于很难获…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

映射网络驱动器自动断开的解决方法

如果将驱动器映射到网络共享&#xff0c;映射的驱动器可能会在定期处于非活动状态后断开连接&#xff0c;并且 Windows 资源管理器可能会在映射驱动器的图标上显示红色 X。&#xff0c;出现此行为的原因是&#xff0c;系统可以在指定的超时期限后断开空闲连接&#xff0c; (默认…

【Kubernetes】k8s的调度约束(亲和与反亲和)

一、调度约束 list-watch 组件 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和…