IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++笔记:std::string(一) -> 正文阅读

[C++知识库]C/C++笔记:std::string(一)

需求:把两个字符串拼接一下.

	char strA[0x10] = "123";
	char strB[0x10] = "456";

	char strC[0x20];
	memcpy(strC, strA, strlen(strA));
	memcpy(strC + strlen(strA), strB, strlen(strB) + 1);

	std::cout << strC << std::endl;

1. 初始化

std::stringC++提供的字符串,利用std::string声明一个字符串:

  • #include <string>

1.1. 初始化方法一

  • std::string 变量名称 { "字符串"};
std::string str { " 这是一个字符串" };

std::cout << str;
std::cin >> str;

1.2. 初始化方法二

  • std::string 变量名称 { "字符串", 要截取的长度};
	std::string str2 { "abcde", 3};
	
	std::cout << str2 << std::endl; // abc
	
	std::string str3 { "这是一个字符串", 4};
	
	std::cout << str3 << std::endl; // 这是

注意:截取的数据代表字节数,一个汉字是两个字节。

1.3. 初始化方法三

  • std::string 变量名称 { "字符串",起始位置, 要截取的长度};
	std::string str4 { "abcde", 1,  3};
	
	std::cout << str4 << std::endl; // bcd

注意:截取的数据代表字节数,一个汉字是两个字节。

1.4. 初始化方法四

  • std::string 变量名称 (要复制的个数,'字符');
	std::string str5 {6, 'a'};
	
	std::cout << str5 << std::endl; // 666666

2. 使用

2.1. 拼接字符串

2.1.1. 使用 “+

std::string  str {"这是一个字符串"};

str = str + "哈哈哈";

std::cout << str << std::endl; // 这是一个字符串哈哈

2.1.2. 直接拼接

#define SoftName "ADB"

#define SoftVersion "1.0"

std::string strV;

strV = SoftName SoftVersion;

std::cout << strV << std::endl; // ADB1.0

2.1.3. str.append();

.append();方法可以连接一个字符串;

  1. 常规
std::string str{ "123" };

str.append("456");

std::cout << str << std::endl; //123456

str.append("789").append("1011");

std::cout << str << std::endl; //  1234567891011
  1. append("字符串",int) 截取拼接,:截取第几个,然后再拼接;
std::string str{ "123"};

str.append("456", 1);

std::cout << str << std::endl;  // 1234
  1. append("字符串",int, int ) 截取拼接:从第几个开始,往后截取几个;
std::string str{ "123" };
	
str.append("456789", 2, 3);

std::cout << str << std::endl; //123678
  1. append(int,' 字符') 字符复数拼接
std::string str{ "123"};

str.append(5, 'a');

std::cout << str << std::endl;  // 123aaaaa

2.1.4 拼接字符串和数字

要先把数字转换成字符串;

语法:

  • std::to_string(数字);
std::string str = std::to_string(123);

2.2. 深入探讨std::string的拼接

std::string  str {"这是一个字符串"};

str = str + "哈哈哈";

str  = "123" + "456";//错误

注意:

  • 两个string能相加,是因为string类把运算符++=都重载过,++=string的重载函数。也可以把string和字符串常量相加,但必须保证每个加法运算符+的两侧的运算对象至少有一个是string。`
  • "123""456"这两个常量在内存里是char类型的数组(const char[4]),char类型的数组无法相加,所以会报错。

变通方法:

str = std::string { "123" } + "456";

str = "456" + "123" + string { "123" }; //错误

str = "456" + ("123" + string { "123" });

str += "123" + "345"; //错误
  • str = "456" + "123" + string { "123" }; //错误 加法的运算优先级是从左往右,"456""123"是不能做加法的;
  • str += "123" + "345"; //错误 运算优先级的问题,+=的优先级排在+的后面,所以同样是因为先进行"123" + "345"运算问题;

stringchar的拼接:

std::string str7{"123"};

str7 = str7 + 'a';

std::cout << str7 << std::endl;

str7 += 'b';

std::cout << str7 << std::endl;

str7 = str7 + 'w' + 'o';

std::cout << str7 << std::endl;

std::string str8{"123"};

str8 += '1' + '2';

std::cout << str8 << std::endl;  // 123c

std::string str9{"123"};

str9 += 'w' + 'o';

std::cout << str9 << std::endl; // 123   错误
  • stringchar是可以相加的(string重载的+运算符!可以对char类型进行相加!);
  • charchar 也是可以相加的(char类型本质上是整数,只是通过ASCII表限定了,两个char相加就是通过ASCII码相加)比如:str8 += '1' + '2'; 通过查ASCII'1' = 49,'2' = 50, '1' + '2' = 99 == 'c',所以str8可以打印出123c;

总结 : charchar 可以相加, char[]char[] 不可以相加;

  • str9 += 'w' + 'o';打印出错是因为 'w' +'o' = 119 + 111 = 230, 230超出了ASCII范围,所以str9只能打印出123;

2.3. 截取字符串

2.3.1 .substr();

  1. .substr(起始位置,要截取的长度);
std::string str{ "123456" };

std::string strsubA{ str.substr(1, 3) }; //strsubA = "234"
  1. 变形 .substr(起始位置); 从起始位置,往后截取全部
std::string str{ "123456" };

std::string strsubB{ str.substr(1) };   //strsubB = "23456"

2.4. 获取字符串的长度

.length()

  • 中文因为编码格式的问题,会有差异;
std::string str{ "123456" };

std::cout << str.length(); //6

2.5. 访问string字符串中的字符

std::string str {"0123456789ABC"};

str[0] = '0';

str[10] = 'A';

2.6. string字符串做比较

2.6.1.

string字符串可以用比较运算符和另一个string字符串或者C标准的字符串(char*)来进行比较;

支持的比较运算符有==!=><>=<=;

比较的原则:位依次进行字符大小的比较。

std::string str_1{ "abcde" };
std::string str_2{ "bcase" };
if (str_1 < str_2) std::cout << "str_1 < str_2" << std::endl;

2.6.2. .compare()

.compare()是string类型自带的一个方法,可以用来比较与另一个string或C标准字符串的大小,比较完成后返回的是一个int类型的值;

std::string strA{"abcd"};
std::cout << strA.compare("abcd") << std::endl;   //相比 相等 返回 0
std::cout << strA.compare("bcdfef") << std::endl; //相比 小   返回 负数
std::cout << strA.compare("ABCD") << std::endl;   //相比 大   返回 正数

.compare()的扩展用法

  • .compare(起始位置,参与比较的长度,被比较的字符串,被比较字符串的起始位置,被比较字符串的比较长度)
std::string strB{"abcd cdef ghijk"};
strB.compare(5, 4, "cdef ghijklm", 0, 4); //返回 0 表示相等 "cdef" 比较“cdef”

2.7. string字符串的搜索

2.7.1.

.find()是string类型自带的一个方法,用来搜索自负床的内容,并且返回内容所在的位置,当返回值为std::string::npos时,表示未找到

语法:

  • .find(要搜索的内容,开始搜索的位置);"开始搜索的位置"可省;
  • .find(要搜索的内容,开始搜索的位置,要纳入搜索的长度);
std::string strA{ "abcdcdef ghijk" };

std::cout << strA.find("cdef") << std::endl; // 返回 4

std::cout << strA.find("cdef",6) << std::endl; // 返回一个大数(std::string::npos),表示未找到

if (strA.find("cdef", 6) == std::string::npos) std::cout << "未找到";

//0:表示 从strA第0位开始搜索,
//2:表示 截取搜索对象的两位,即搜索“cd”,
//所以返回2;
std::cout << strA.find("cdef", 0, 2) << std::endl; //返回 2

2.7.2.

.rfind()是string类型自带的一个方法,用来 搜索字符串中的内容,并且返回内容所在的位置,当返回值位std::string::npos时,表示未找到,与find()不同的是,rfind()是从字符串的末端开始查找;

语法:

  • .rfind(要搜索的内容);
std::string strA{ "abcdcdefghijk" };
std::cout<< strA.rfind("jk");//返回11

2.8. string插入字符串

.insert()是string类型的一个方法可以在一个string字符串的指定位置插入另一个字符串;
基本语法:

  • .insert(要插入的位置,要插入的字符串);
std::string idStr{ "id=;" };
std::cout << idStr.insert(3, "testid"); //输出 : id = testid;
  • .instert(要插入的位置,要插入的字符个数,要插入的字符);
std::string id {"id=;"};
id.insert(3, 6, '*') //输出: id=******;

2.9. string替换字符串

.replace()是string 类型提供的一种方法,可以替换string字符串中的内容;

语法:

  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”);
std::string str{ "id=user;" };
std::cout<<str.replace(3, 4, "zhansan"); //id=zhangsan;
  • .replace(要替换的内容起始位置,要替换的长度,替换后的字符长度,'字符');
std::string str{ "id=user;" };
std::cout<<str.replace(3, 4, 5, '*'); // id=*****;
  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”,替换后内容的节选长度);
std::string str{ "id=user;" };
std::cout << str.replace(3, 4, "zhangsan;pass=255;", 10); //id=zhangsan;p;
  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”,替换后内容的起始位置,替换后内容的节选长度);
std::string str{ "id=user;" };
std::cout<<str.replace(3, 4, "zhangsan;pass=255;", 5, 8); // id=san;pass;

2.10. string删除字符串

.erase()是string类型提供的一种方法,可以删除string字符串中的内容;

语法:

  • .erase(要删除的起始位置,要删除的起始长度);
std::string str{ "id=user;" };
std::cout << str.erase(3, 4); //id=;
  • .erase(要删除的起始位置); 从起始位置开始删除所有内容
 std::string str{ "id=user;" };
std::cout << str.erase(3,); //id=
  • .erase(); 删除字符串所有内容;
  • .clear(); 删除字符串所有内容。

3. 字符串的应用

std::string str{"id=usrId;pass=qwerr;role=Tom"};
   std::string strIn;
   std::string strOut;
   while (true)
   {
   	std::cout << "请输入您要查阅的属性\n";
   	std::cin >> strIn; //输入属性的字段如“id”;
   	int lfind = str.find(strIn + "=");
   	if (lfind == std::string::npos)
   		std::cout << "对不起,您要查阅的属性不存在";
   	else 
   	{
   		int lend = str.find(";", lfind);
   		strOut = str.substr(lfind + strIn.length() + 1, lend - lfind - strIn.length() - 1);
   		std::cout << strOut << std::endl;
   	}
   }

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:47:23  更:2022-05-14 09:47:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 15:32:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码