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

C++(String):

目录

string与C中字符串的区别:

C字符串:

string字符串:

string的定义和初始化:

输入字符串:

方式1:

方式2:

字符串的拼接的操作:

方式1:使用“+”

方式2:使用“+=”

方式3:使用append()

字符串的查找和替换:

使用find函数进行查找目标的字符串:

替换:

字符串的截取:

查询长度、大小、容量和删除、插入、清空操作:

减少容量的大小:

遍历操作:

可以使用索引进行访问:

可以使用迭代器进行访问:

可以使用at()函数:

大小写转换和数字之间的转换:

大小写转换:

类型转换:


String是标准库提供的字符串类,位于头文件<string>中,提供了丰富的成员函数和更高的安全性。

string与C中字符串的区别:

C字符串:

char ch[]="Hello World";

字符数组末尾以"\0"结尾,需手动管理内存。

string字符串:

std::string str="Hello World";

自动管理内存,提供了丰富的成员函数。

string的定义和初始化:

#include <iostream>
#include <string>int main(){std::string str;//默认初始化std::string str1 = "Hello World";//使用字符串字面常量进行赋值std::string str2 = str1;//将str1赋值给str2std::string str3(str2);//使用拷贝构造函数std::string str4(str3,0,5);//使用部分初始化,第二个参数为起始下标,第三个参数为个数std::string str5(6,'a');//使用重复的字符串进行初始化std::cout<<str<<std::endl;std::cout<<str1<<std::endl;std::cout<<str2<<std::endl;std::cout<<str3<<std::endl;std::cout<<str4<<std::endl;std::cout<<str5<<std::endl;return 0;
}

运行结果:

输入字符串:

方式1:

使用"cin"输入字符串时,默认会以空格、制表符或换行符作为分隔符,因此当遇到第一个空格、制表符或者换行符时就会停止读取。

#include <iostream>
#include <string>int main(){std::string str;std::cin>>str;std::cout<<str<<std::endl;return 0;
}

示例运行结果:

方式2:

使用"getline()"输入,直到遇到换行符才会停止读取。需要包含头文件<string>

#include <iostream>
#include <string>int main() {std::string str;std::getline(std::cin, str);std::cout << str << std::endl;return 0;
}

示例运行结果:

字符串的拼接的操作:

方式1:使用“+”

#include <iostream>
#include <string>int main() {std::string str;std::getline(std::cin, str);std::cout << "str:" << str << std::endl;std::string str1;std::getline(std::cin, str1);std::cout << "str1:" << str1 << std::endl;std::string str2 = str + str1;std::cout << "str2:" << str2 << std::endl;return 0;
}

示例运行结果:

方式2:使用“+=”

#include <iostream>
#include <string>int main() {std::string str1;std::getline(std::cin, str1);std::cout << "str1:" << str1 << std::endl;std::string str2;std::getline(std::cin, str2);std::cout << "str2:" << str2 << std::endl;str2 += str1;std::cout << "newstr2:" << str2 << std::endl;return 0;
}

示例运行结果:

方式3:使用append()

#include <iostream>
#include <string>int main() {std::string str1;std::getline(std::cin, str1);std::cout << "str1:" << str1 << std::endl;std::string str2;std::getline(std::cin, str2);std::cout << "str2:" << str2 << std::endl;str2.append(str1);std::cout << "newstr2:" << str2 << std::endl;return 0;
}

示例运行结果:

字符串的查找和替换:

使用find函数进行查找目标的字符串:

#include <iostream>
#include <string>int main() {std::string str1 = "Apple‌‌Banana‌Orange‌‌Pineapple‌Grape‌Strawberry‌Watermelon‌‌Pomegranate‌";unsigned index = str1.find("Pomegranate‌");if (index != std::string::npos) {std::cout << "找到想要找到的目标字符串" << std::endl;std::cout << "目标字符串的位置:" << index << std::endl;}else {std::cout << "没有找到想要找到的目标字符串" << std::endl;}return 0;
}

示例运行结果:

替换:

使用replace(参数1,参数2,参数3):目标字符串,起始位置,长度。

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::cout << "替换之后的str1:" << str1 << std::endl;unsigned index = str1.find("str4");std::string str2 = " == ";if (index != std::string::npos) {std::cout << "找到想要找到的目标字符串" << std::endl;str1.replace(index, str2.length() , str2);std::cout << "替换之后的str1:" << str1 << std::endl;}else {std::cout << "没有找到想要找到的目标字符串" << std::endl;}return 0;
}

示例运行结果:

字符串的截取:

使用substr(参数1,参数2):起始位置,长度

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::string str2 = str1.substr(11, 4);std::cout << "str2:" << str2 << std::endl;return 0;
}

示例运行结果:

查询长度、大小、容量和删除、插入、清空操作:

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;if (str1.empty()) {std::cout << "str1为空" << std::endl;}else {std::cout << "str1非空" << std::endl;}//删除操作str1.erase(0, 4);//从下标为0开始删除,删除的长度为4std::cout << "str1第一次删除之后的结果:" << str1 << std::endl;str1.erase(str1.begin(), str1.begin() + 4);//使用迭代器进行删除,起始位置为str的首字符地址,往后删除4个字符std::cout << "str1第二次删除之后的结果:" << str1 << std::endl;str1.erase(0);//当只有一个值时,从起始位置一直删除到最后std::cout << "str1第三次删除之后的结果:" << str1 << std::endl;std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;//插入操作str1.insert(0,"str1");//从下标为0的位置进行插入std::cout << "str1插入之后的结果:" << str1 << std::endl;std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;//清空字符串str1.clear();std::cout << "str1清空之后的结果:" << str1 << std::endl;std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;return 0;
}

示例运行结果:

上述例子可以知道,字符串的实际长度和容量并不一定是相等的,当超过容量是,会自动进行扩容。当对字符串进行删除或者清空内容之后,实际的容量并不会进行变化。所以如果当一开始插入的字符串很长,那么就需要预留更大的空间来进行存储,但是之后对字符串进行清空之后存储一个很小的字符串,那么就会浪费空间。

resize(参数1,参数2)函数:

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;std::cout << std::endl;str1.resize(31, '0');std::cout << str1 << std::endl;std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;std::cout << std::endl;str1.resize(10);std::cout << str1 << std::endl;std::cout << "str1的长度:" << str1.length() << std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的实际容量:" << str1.capacity() << std::endl;return 0;
}

示例运行结果:

使用resize(参数1,参数2)时,当指定的字符串长度大于当前字符串长度时,默认用空字符(\0)填充新增位置,或通过参数2指定填充字符。

当指定的字符串的长度小于当前字符串的长度时,丢弃第n个位置之后的字符,但‌不释放内存‌(容量capacity()保持不变)。可以知道使用resize()函数并不能减少容量的大小。

减少容量的大小:

使用shrink_to_fit()函数在清空字符串之后进行重置容量的大小。

#include <iostream>
#include <string>int main(){std::string str1 = "str1str2str3str4str5";std::cout<<str1.capacity()<<std::endl;str1.clear();std::cout<<str1.capacity()<<std::endl;str1.shrink_to_fit();std::cout<<str1.capacity()<<std::endl;return 0;
}

示例运行结果:

可以利用局部变量的特性,因为string是一个类,可以利用其析构函数对其进行释放。

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::cout << str1.capacity() << std::endl;str1.clear();std::cout << str1.capacity() << std::endl;{std::string str2;str2.swap(str1);std::cout << "str1:" << str1.capacity() << std::endl;std::cout << "str2:" << str2.capacity() << std::endl;}std::cout << "str1:" << str1.capacity() << std::endl;return 0;
}

示例运行结果:

str1.swap(str2) 会交换两者的所有内部状态(包括容量)。当与空字符串交换时,str1 的容量会被替换为空字符串的初始容量。

#include <iostream>
#include <string>int main() {std::string str1 = "str1str2str3str4str5str6";std::string str2 = "";str2.swap(str1);std::cout << "str1的长度:" << str1.length()<< std::endl;std::cout << "str1的大小:" << str1.size() << std::endl;std::cout << "str1的容量大小:" << str1.capacity() << std::endl;std::cout << "str1:" << str1 << std::endl;std::cout << "str2的长度:" << str2.length() << std::endl;std::cout << "str2的大小:" << str2.size() << std::endl;std::cout << "str2的容量大小:" << str2.capacity() << std::endl;std::cout << "str2:" << str2 << std::endl;return 0;
}

实例运行结果:

遍历操作:

可以使用索引进行访问:

#include <iostream>
#include <string>int main() {std::string str1 = "abcdefghijklmnopqrstuvwxyz";for (int index = 0; index < str1.size(); index++) {std::cout << str1[index] << " ";}return 0;
}

示例运行结果:

可以使用迭代器进行访问:

#include <iostream>
#include <string>int main() {std::string str1 = "abcdefghijklmnopqrstuvwxyz";for (auto it = str1.begin(); it != str1.end(); ++it) {std::cout << *it << " ";}return 0;
}

实例运行结果:

可以使用at()函数:

#include <iostream>
#include <string>int main() {std::string str1 = "abcdefghijklmnopqrstuvwxyz";for (int index = 0; index < str1.size(); index++) {std::cout << str1.at(index) << " ";}return 0;
}

实例运行结果:

大小写转换和数字之间的转换:

大小写转换:

C++ 中可通过 <cctype> 头文件调用,并建议配合 std::transform 处理字符串。

toupper:将字符转换为大写字母,如果原字符是大写,则不变。

tolower:将字符转换为小写字母,如果原字符是小写,则不变。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>int main() {std::string str1 = "abcdefghijklmnopqrstuvwxyz";std::transform(str1.begin(), str1.end(), str1.begin(), [](unsigned char ch) {return std::toupper(ch); });std::cout << str1 << std::endl;std::transform(str1.begin(), str1.end(), str1.begin(), [](unsigned char ch) {return std::tolower(ch); });std::cout << str1 << std::endl;return 0;
}

示例结果运行:

类型转换:

#include <iostream>
#include <string>int main() {int number = 100;double IP = 3.141926;std::string str1 = std::to_string(number);std::string str2 = std::to_string(IP);std::cout << "str1:" << str1 << std::endl;std::cout << "str2:" << str2 << std::endl;str1.append("00");str2 = str2.substr(0,6);std::cout << "str1:" << str1 << std::endl;std::cout << "str2:" << str2 << std::endl;number = std::stoi(str1);IP = std::stod(str2);std::cout << "number:" << number << std::endl;std::cout << "IP:" << IP << std::endl;return 0;
}

实例运行结果:

http://www.dtcms.com/a/349142.html

相关文章:

  • 2025 年 8 月 22 日科技前沿:技术突破与范式跃迁的交汇点
  • golang1 专栏导学
  • 算法题(190):食物链(带权并查集)
  • leetcode 162 寻找峰值
  • 1、vue2面试题--生命周期
  • Goang开源库之go-circuitbreaker
  • HTTP请求中的CGI请求与登录注册机制
  • AI大模型企业落地指南-笔记01
  • Data_Formats_GRIDGeoTIFFShapeFile
  • 数据产品(2)用户画像数据分析模型
  • 【计算机视觉】CaFormer
  • 房屋装修设计管理系统的设计与实现/房屋装修管理系统
  • 审核问题——应用未配置图标的前景图和后景图
  • 深度剖析Spring AI源码(十):实战案例:智能客服系统
  • MySQL-delete tableName from ...
  • [GeographicLib] LocalCartesian用法
  • 从成本中心到价值创造者:网络安全运维的实施框架与价值流转
  • 深入两种高级并发设计模式
  • 零基础玩转STM32:深入理解ARM Cortex-M内核与寄存器编程
  • 奈飞工厂:算法优化实战
  • MySQL性能优化的5个维度
  • 02-开发环境搭建与工具链
  • 【Android Kotlin】Kotlin专题学习
  • 十一、redis 入门 之 数据持久化
  • [滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组
  • 3.6 虚拟存储器 (答案见原书 P225)
  • 国内第一本系统介绍 Obsidian 的书出版了
  • 基于Python的淘宝电商服装价格可视化分析
  • 【知识杂记】卡尔曼滤波及其变种,从理论精要到工程实践深入解析
  • AI代理需要数据完整性