需求:把两个字符串拼接一下.
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;
std::string
是C++
提供的字符串,利用std::string
声明一个字符串:
#include
std::string 变量名称 { "字符串"};
std::string str { " 这是一个字符串" };
std::cout << str;
std::cin >> str;
std::string 变量名称 { "字符串", 要截取的长度};
std::string str2 { "abcde", 3};
std::cout << str2 << std::endl; // abc
std::string str3 { "这是一个字符串", 4};
std::cout << str3 << std::endl; // 这是
注意
:截取的数据代表字节数,一个汉字是两个字节。
std::string 变量名称 { "字符串",起始位置, 要截取的长度};
std::string str4 { "abcde", 1, 3};
std::cout << str4 << std::endl; // bcd
注意
:截取的数据代表字节数,一个汉字是两个字节。
std::string 变量名称 (要复制的个数,'字符');
std::string str5 {6, 'a'};
std::cout << str5 << std::endl; // 666666
+
”std::string str {"这是一个字符串"};
str = str + "哈哈哈";
std::cout << str << std::endl; // 这是一个字符串哈哈
#define SoftName "ADB"
#define SoftVersion "1.0"
std::string strV;
strV = SoftName SoftVersion;
std::cout << strV << std::endl; // ADB1.0
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
要先把数字转换成字符串;
语法:
std::to_string(数字);
std::string str = std::to_string(123);
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
;.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"
.length()
std::string str{ "123456" };
std::cout << str.length(); //6
string
字符串中的字符std::string str {"0123456789ABC"};
str[0] = '0';
str[10] = 'A';
string
字符串做比较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;
.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”
string
字符串的搜索.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
.rfind()
是string类型自带的一个方法,用来 搜索字符串中的内容,并且返回内容所在的位置,当返回值位std::string::npos
时,表示未找到,与find()
不同的是,rfind()
是从字符串的末端开始查找;
语法:
.rfind(要搜索的内容);
std::string strA{ "abcdcdefghijk" };
std::cout<< strA.rfind("jk");//返回11
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=******;
string
替换字符串.replace()
是string 类型提供的一种方法,可以替换string字符串中的内容;
语法:
.replace(要替换的内容起始位置,要替换的长度,“替换后的内容”);
std::string str{ "id=user;" };
std::cout<
.replace(要替换的内容起始位置,要替换的长度,替换后的字符长度,'字符');
std::string str{ "id=user;" };
std::cout<
.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<
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();
删除字符串所有内容。string
字符串转换为数字stringstream
流std::stringstream
定义在
头文件中;std::cout
组织数据的形式有些时候要比string
字符串要方便。
std::stringstream
可以像std::cout
一样组织数据;
std::stringstream.str()
方法将会返回一个string
,里面是std::stringstream
的内容;
std::stringstream strSt;
strSt << "你好" << 123;
std::string _str = strSt.str();
std::cout << _str; // 你好,123
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;
}
}
std::string strIn;
std::cin >> strIn;
int length{ 0 };
for (int i = 0; strIn[i]; i++)
{
if (strIn[i] < 0)i++;
length++;
}
std::cout << length;