需求:把两个字符串拼接一下.
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::string 是C++ 提供的字符串,利用std::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(); 方法可以连接一个字符串;
- 常规
std::string str{ "123" };
str.append("456");
std::cout << str << std::endl; //123456
str.append("789").append("1011");
std::cout << str << std::endl; // 1234567891011
append("字符串",int) 截取拼接,:截取第几个,然后再拼接;
std::string str{ "123"};
str.append("456", 1);
std::cout << str << std::endl; // 1234
append("字符串",int, int ) 截取拼接:从第几个开始,往后截取几个;
std::string str{ "123" };
str.append("456789", 2, 3);
std::cout << str << std::endl; //123678
append(int,' 字符') 字符复数拼接
std::string str{ "123"};
str.append(5, 'a');
std::cout << str << std::endl; // 123aaaaa
2.1.4 拼接字符串和数字
要先把数字转换成字符串;
语法:
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" 运算问题;
string 和char 的拼接:
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 错误
string 和char 是可以相加的(string 重载的+运算符!可以对char类型进行相加!);char 和 char 也是可以相加的(char 类型本质上是整数,只是通过ASCII 表限定了,两个char 相加就是通过ASCII 码相加)比如:str8 += '1' + '2'; 通过查ASCII 表'1' = 49 ,'2' = 50 , '1' + '2' = 99 == 'c' ,所以str8 可以打印出123c ;
总结 : char 和char 可以相加, char[] 和char[] 不可以相加;
str9 += 'w' + 'o'; 打印出错是因为 'w' +'o' = 119 + 111 = 230, 230超出了ASCII范围 ,所以str9 只能打印出123 ;
2.3. 截取字符串
2.3.1 .substr();
.substr(起始位置,要截取的长度);
std::string str{ "123456" };
std::string strsubA{ str.substr(1, 3) }; //strsubA = "234"
- 变形
.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() 是从字符串的末端开始查找;
语法:
std::string strA{ "abcdcdefghijk" };
std::cout<< strA.rfind("jk");//返回11
2.8. string 插入字符串
.insert() 是string类型的一个方法可以在一个string字符串的指定位置插入另一个字符串; 基本语法:
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;
}
}
|