C++入坑系列(四)复合类型之字符串

eDP、DP与HDMI——现代显示接口的核心解析 eDP、DP和HDMI各有千秋:eDP以嵌入式设备的低功耗见长,DP凭借开放生态和高带宽成为专业领域首选,而HDMI则依靠庞大的消费电子生态稳居家庭市场。未来,随着Type-C接口的普及和超高清内容的爆发,三者的技术边界可能进一步融合,但各自的核心优势仍将长期共存。对于用户而言,选择接口需基于设备需求——游戏玩家青睐HDMI的VRR,设计师依赖DP的多屏扩展,而轻薄本则离不开eDP的紧凑设计。 阅读详情

前言

字符串是存储在内存中的连续字节中以 \0 作为结尾的的一系列字符。在C语言中,我们将其称之为C风格字符串,而在C++中,我们使用string类的方式去处理字符串。本文,我们将着重介绍C++里面的string类的知识。虽然处理方法不同,但是C++仍然可以使用C语言中的处理方法。

C语言中的字符串

定义

由于在C语言中不支持字符串数据类型,所以需要使用其他的方法实现字符串的相关操作。主要有两种方法:
1、利用字符数组的方式:
在利用字符数组定义一个字符串时,同样具有两种形式,如下:

/*方式1*/
char char_string[] = {'H','e','l','l','o',' ','L','i','n','u','x','\0,};//显示'\0'
/*方式2*/
char char_string[] = "Hello Linux";//隐藏了'\0'

需要注意的是,如果方式1中的最后一个字符不是 \0 ,那么该字符数组不是字符串,而仅仅是一个普通的字符数组。
2、利用字符串指针的方式,如下:

char* pString = "Helllo Linux";

操作字符串的相关函数

在C语言中,系统提供了操作字符串的相关库函数,用于简化对字符串的处理。如果需要使用它们的话,需要首先包含string.h(C语言中)头文件或者**cstring(C++中)**头文件。常见的字符串处理函数如下:

函数名称函数作用
strlen计算字符串的长度(不包括\0)并返回
strcpy对两个字符串进行比较(连续进行单个字符的比较)
strcat将两个字符串进行连接
strcpy将字符串复制给另一个字符串
……

有关上述库函数的原型,请直接进入string.h头文件中进行查看。
程序示例1:计算字符串的长度

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char* string1 = "Hello Linux";
	cout << strlen(string1) << endl;//长度为11
	char string2[] = "This is a test";
	cout << strlen(string2) << endl;//长度为14
}

程序示例2:拷贝字符串

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    const char* array1 = "Hello Linux";
    char array2[20] = {' '};
    strcpy(array2,array1);//在实际工程中慎用!!!因为只会拷贝\0前面的字符,更好的方法是使用strncoy函数实现字符串的拷贝
    cout << array2 << endl;//输出Hello Linux
    return 0;
}

小结

对于C语言风格的字符串,其实际上就是一个字符数组,所以处理的方式与数组的处理方式类似,同样也会受到与数组同样的限制,比如:不能整体赋值等。只是,C语言中增加了一些专门处理字符串的一些库函数,简化了相关的操作,如上所述。

C++中的字符串

定义

在C++中,新增了一个数据类型string专门用于声明一个字符串。严格上来说,string是一个类数据类型,我们称之为string类,如果要使用该类,必须包含string头文件,并且,string类还包含在命名空间std中,所以我们必须利用using namespace std使用该命名空间,或者直接使用using::string,才能在程序中使用该类及其相应的属性。

操作字符串的方法

由于C语言中都是以字符数组或者字符指针的形式定义字符串的,所以必须利用相应的字符串操作库函数才能实现字符串的拷贝、连接、复制等功能。但是在C++中,由于使用的是string类,所以便可以利用简单的成员函数,就可以实现上述功能。再结合运算符重载,使得C++处理字符串变得更加灵活。
比如:我们可以直接利用赋值运算符=,将一个string对象赋值给另一个string对象,也可以直接通过关系运算符对两个string对象直接进行比较等等。总之,使用起来更加灵活,简单。唯一需要注意的是,在使用之前需要包含头文件string以及使用命名空间std。
综合程序示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 = "Hello Linux";
    string str2;
    str2 = str1;//将str1字符串拷贝给str1
    cout << str2 << endl;
    cout << str2.size() << endl;//输出str2字符串的长度,也是忽略\0
    str2 += str1;//将str2和str1字符串进行拼接,然后赋值给str2
    cout << str2 << endl;
    cout << str2.size() << endl;//再次输出str2字符串的长度
    if(str1 == str2)//判断str1与str2是否相等,很明显,不相等
    {
        cout << "str1 and str2 is equal" << endl;
    }
    else
    {
        cout << "str1 and str2 is not equal" << endl;
    }
    return 0;
}

程序运行结果如下:
在这里插入图片描述

注意事项–Very Important

绝对不可以利用strlen函数计算string对象字符串的长度。因为strlen是计算字符数组中字符串长度的库函数,而利用string关键字创建的字符串是string类的一个对象。而只能利用诸如string类的成员函数**string.size()**获取字符串的长度的。

字符与字符串之间的差异

无论是在C语言还是C++中,字符都是在单引号 ’ ’ 中,而字符串都是在双引号 " " 中,是两种完全不同的数据类型。即使在下面的情况下,两种数据类型也是不可以互相转换的。

char signalChar = 'S';//表示一个字符S
char* stringChar = "S";//表示一个字符串,S和\0

我们只需要牢记:用单引号括起来的就是字符,用双引号括起来的就是字符串!!!

补充1:C++11标准新增的原始字符串

在C++11标准中,新增了一个原始字符串类型。与普通字符串的区别在于,原始字符串中不存在转义序列等字符,每个字符代表了它本身的含义。比如:\n在原始字符串中,就仅仅代表了字符\和字符n。那么,如何在程序中使用原始字符串呢?方法就是利用**"(和)"**作为界定符,如下所示:

//原始字符串的使用
cout << R"(This is a test\n)" << '\n';//输出结果:This is a test\n

由于原始字符创并不常见,所以此处仅仅做一个简单的介绍。详细的内容请查阅C++11中的相关介绍。并且,如果需要使用这一类型,那么您的编译器必须支持C++11的标准。

补充2:字符串的输入和输出

利用cin输入字符串(面向单词)

当程序中利用cin输入字符串时,cin使用空白,比如:空格、换行符、制表符等来确定字符串的结束位置。这意味着,当输入的字符串中间存在空白的情况时,将导致赋值为相应变量的字符串的数据丢失,为便于说明,示例如下:

string testString1,testString2;
cin >> testString1;//输入testString1字符串
//输入Hello
cout << "testString1字符串为:" << testString1 << endl;//输出testString1字符串
cin >> testString2;//输入testString2字符串
//输入Hello Linux
cout << "testString2字符串为:"<< testString2 << endl;//输出testString2字符串

输出结果如下:
在这里插入图片描述

输入一行字符串(面向行)

在上面的例程中,可以发现:利用cin输入字符串时,空白便会被认为是字符串的结束位置。有时,我们需要输入一行包含空格的字符串,此时,直接利用cin进行输入便无法满足要求了。
在istream类中,提供了一些面向行的成员函数,解决了上述问题,只有当遇到换行符时,才会被人为是字符串的结束。在实际应用中,我们这里介绍三种方法实现此目的:
1、cin类对象的getline()成员函数:读取指定数目的字符或遇到换行符时停止,并且不保存换行符,主要用于操作字符数组:

char test[20];
cin.getline(test,10);//从输入的语句中读取10个元素,存入test数组中

2、getline()函数:读取一整行的字符,遇到换行符才停止,主要用于操作string对象:

string test;
getline(cin,test);//从输入获取一行字符串,并保存在test字符串中

3、get()成员函数,使用方法和第一点的getline()成员函数类似,但是会保存换行符,所以需要额外注意:

cin.get(name1,10);//读取第一行数据
cin.get();//读取第一行数据末尾的换行符
cin.get(name2,10);//读取第二行数据
cin.get();//读取第二行数据末尾的换行符

小结

有关输入队列缓冲的知识,涉及到IO缓冲相关内容,由于不是本文关注的重点,所以暂时不进行更多的拓展。在后续的笔记中,进行更加详细的讨论。

总结

本文主要对字符串进行了简要的介绍。总而言之,C++中的string类就一个字,方便!即使如此,在使用的过程中,需要特别注意C语言中的字符数组与C++中的字符串类型的区别于联系!
本文的疏漏和不足之处,还望各位读者能够及时指正,谢谢。

基于Simulink的发动机管理系统中的自适应增压控制系统设计 通过上述详细设计步骤,我们成功开发了一个基于Simulink的自适应增压控制系统。该系统不仅能够实时监测和预测发动机的运行状态,动态调整增压压力目标值,还具备实时监控、故障诊断和保护功能,确保系统的安全性和可靠性。此外,通过仿真实验和硬件在环测试,我们验证了系统的性能,并对其进行了优化,使其能够更好地满足实际应用需求。这个项目展示了如何利用MATLAB/Simulink的强大功能,结合控制理论和工程实践,开发出高效、可靠的自适应增压控制系统。 阅读详情

相关推荐

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 507

C++ 递增递减运算符以及复合运算符

递增递减运算符的应用以及复合运算符的应用

diaodiaodediao的博客 1052

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 432

C++ 复合类型--字符串

C++处理字符串有两种方法:C-字符串,基于string类库。 一.C-字符串:      1. 定义:          以空字符结尾‘\0’. eg.: char cat={'f','a','b','\0'};          或使用字符串常量(string constanst)或字符串字面值(string literal),eg.: char bird[11]="M

324

告别密码明文传输:手把手带你用Python实现SRP-6协议(附完整代码)

本文详细介绍了如何使用Python实现SRP-6协议,确保密码安全传输和存储。通过零知识证明与密钥交换技术,SRP协议在不传输明文密码的情况下完成认证,适用于金融App等高安全需求场景。文章包含完整代码示例和实战技巧,帮助开发者规避常见安全陷阱。

weixin_30689307的博客 412

华为C语言笔试题(附答案)

华为C语言笔试题(附答案)     1、局部变量能否和全局变量重名?   答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "   局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。  

峰云四起 3033

整理C/C++中的复合运算符

今天看程序,突然发现了 ^= 这个符号,因为我原来很少用 ^ (位逻辑异或) ,一开始没反应过来,baidu google基本无法检索特殊符号的,但知道它是个复合赋值运算符,所以查到了 ^= 位异或赋值运算符。 下面就整理一下c/c++中的所有运算符和复合赋值运算符(如果有不全,欢迎补充)。   C的运算符有以下几类: 1.算术运算符:* - + / 2.关系运算符: > = 3.逻辑运

blog 6716

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9753

C++用栈Stack实现数学复合运算

          关键思想是运算符的优先级设置,分别使用一个数字栈和一个运算符栈,等到运算符栈为空,运算结束了。   compute.cpp // compute.cpp : Defines the entry point for the console application. // #include&lt;iostream&gt; using namespace std; ...

yuzhiyun3536的专栏 473

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南——OpenClaw的赚钱底层逻辑与“记忆”革命

AI 的商业价值不在于替代思考,而在于沉淀关系。当 Agent 记住你的偏好、你的历史、你的目标,它就不再是冷冰冰的软件,而是成为数字化的关系资产。这种资产的稀缺性不在于技术复杂度,而在于时间无法被压缩——你无法用更好的算法替代 3 个月的协作记忆。在这场“记忆革命”中,护城河不是模型参数,而是用户与 AI 共同书写的历史。OpenClaw 用一套优雅的文件系统架构,将这种历史转化为可积累、可复用、可变现的数字资产。从“计算即服务”(CaaS)到“记忆即服务”(MaaS)。

冯·诺依曼 1341

知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通。我们从文本数据中采集到关键信息,并抽取出其中的关系信息,然后在存入图数据库中,整个过程实现自动化,我这里将举一个文本例子进行抽取。 对于知识图谱的构建是将实体、概念和它们之间的关系都以图表形式呈现出来的一种数据结构。要构建一个知识图谱,需要从不同的数据源中采集到相关信息,并将这些信息整合在一起,最终形成一个全面而且精确的知识图谱。

微学AI的博客 2545

C++中的复合类型

文章目录重温C++ 复合类型在程序中 使用结构体结构体赋值结构体数组结构体中位字段共用体枚举指针如何声明一个指针将指针初始化为一个地址使用new来分配内存指针和数组之间的差别指针、数组和指针算术指针和字符串使用new创建动态结构delete使用示例类型组合数组的替代品模板类vector模板类array 重温C++ 复合类型 在程序中 使用结构体 // structur.cpp -- a simpl...

andrewbytecoder 3616

【推荐100个unity插件】基于节点的程序化无限地图生成器 —— MapMagic 2

MapMagic 2是一款基于节点的程序化地形生成工具,可快速创建无限地图。主要功能包括:通过图形化节点编辑器构建地形逻辑;支持四个核心模块(对象、样条线、生物群落和笔刷);提供完整的操作指南,包括创建资产、使用编辑器窗口、节点操作等。工具具有直观的UI界面,支持节点连接、参数调整、图层管理等功能,并能实时生成地形。适合游戏开发者快速构建高质量的可玩地形环境。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3121

C++系列第六篇 数据类型下篇 - 复合类型(数组及字符串)

数组(array)是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素,数组元素在内存中是连续的,这一点很重要,很多性能优化和算法都会用到这个特性。

犀牛卫士 1067

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c++中的复合类型

c++中的复合类型(数组,字符串,结构体,共用体,枚举) 本文为本人阅读c++ primer plus第4章复合类型做的小笔记,只是记录本人不熟悉或者容易出错的地方 数组 声明数组:typeName arrayName[arraySize] arraySize必须是整性常数或者const值,也可以是常量表达式,所有的值在编译的时候都是已知的,不可以是变量 sizeof运算...

qq_37993487的博客 1285

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

浅谈C++复合类型(上半篇)

本文简要讲述了C++中除了指针以外的复合类型,讲述了如何简单地使用这些复合类型,以及使用过程中的注意事项。

潇雪的博客 1374

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++中的几种基本复合类型

摘抄自《C++ Primer Plus》,由于博主比较比较熟悉C语言,所以这里不会有太全面的语法介绍,基本上只是为了和C进行比较,从而突显C++相比于C在复合类型用法方面的特殊之处 文章目录序言结构体共用体枚举类型总结 序言 在C语言中,我们学过的复合类型有结构体、共用体、枚举类型。今天我们就来看看它们在C++中是什么样子。 结构体 1、定义结构体 struct fruit { strin...

Shijia Yin 1088

C++学习笔记——复合类型

return 0;string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组。\n";return 0;数组、结构和指针是C++的3种复合类型。数组可以在一个数据对象中存储多个同种类型的值。通过使用索引或下标,可以访问数组中各个元素。

wfk1234的博客 1146

C++数据类型复合类型篇

复合类型是指在其他类型的基础上定义的类型。C++中内置的复合类型包括指针、引用、数组、结构体、共用体和枚举。下面将会给大家一一介绍。

qq_64452863的博客 1071

用C++ Primer Plus复习C++系列之复合类型

用C++ Primer Plus复习C++系列 /*好长时间没有写博客了,最近忙科研任务的时候,发觉自己的基本功确实不行,慢慢地坚定了以后学习/求职路线是后台开发。我现在实力不够,菜的一批,但是以后要想靠这个吃饭,代码能力是绕不过去的,所以打算就在这里更新我的学习路线,反正也没人看,我也不怕人笑话hhh,就当记录自己的学习过程吧.*/ 第四章:复合类型 sizeof后面接数组名,返回整个数组中的字节数;而strlen()是返回数组中可见的字符串的长度。 char定义的数组,数组结尾处是一个’\0’,

小帜的打怪升级之路 360

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

C++字符串,cin.getline()和cin.get(),很详细的讲解。

muwithxi的博客 478

c++复合类型

在 C++ 中,复合类型是基于基本数据类型构建的。它们允许我们组合和操作多个数据。主要的复合类型包括数组、指针、字符出、结构体、共用体、枚举和类。

shopeeai的博客 597

[C++学习笔记] 第 3 章 复合类型

​ C++ 可以使用string类的对象来储存字符串。要使用string类,必须引头文件。string类位于名称空间std中,其定义隐藏了字符串的数组性质。从这个示例可知:在很多方面,使用string可以使用 C 风格字符串来初始化string对象可以使用cin读入string对象,用cout输出string对象可以使用数组表示法来访问存储在string对象中的字符(通过下标访问)上述程序表明,string。

baymax_123的博客 1035

【C++ Primer Plus】笔记 - 第四章 复合类型

C++ Primer Plus 第四章-复合类型 自学笔记, 可能不适用于所有人, 仅供参考。

Morinnn的博客 1738

C++复合类型及函数学习总结

C++复合类型及函数学习总结 复合类型 复合类型是指在其他类型的基础上定义的类型。C++语言内置的复合类型分为:指针、引用、数组、枚举、结构体、共用体。 1、程序运行时,代码和需要的数据都被存储在内存中。内存是有序的字节序列,每个字节都有唯一的地址,使用这个地址就可以确定字节的位置,用以存获取数据。程序中定义的变量会被分配一定的内存单元,当需要存取这个值时,可以通过变量的名字访问这块内存。除了通过...

qq_43627886的博客 471

C++复合类型

C++复合类型总结数组字符串拼接字符串常量每次读取一行字符串输入面向行的输入:getline()面向行的输入:get()String类 数组 数组声明: 1.存储在每个元素中的值的类型; 2.数组名; 3.数组中的元素数 声明数组的通用格式如下: typeName arrayName[arraySize]; 表达式arraySize指定元素数目,他必须是整型常数(如10)或const值,也可以是常量表达式(如8*sizeof(int)) 字符串 字符串是存储在内存的连续字节中的一系列字符。C++处理字符串

六竹书生_DH的博客 1067
上一篇: C++入坑系列之字符的处理
下一篇: SPI协议读写SD卡介绍
「已注销」
博客等级 码龄7年 49粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值