字符串使用整理总结
1.C和C++字符串对比
C++提供了两种类型的字符串表示形式:
-C风格字符串
-C++引入的string类类型
字符串实际上是使用null字符’\0’终止的一维字符数组。由于在数组的末尾存储了空字符,因此字符数组的大小比"Hello"的字符数多一个。但是在定义字符数组时,不需要把null字符放在字符串常量的末尾。C++编译器会在初始化数组时,自动把’\0’放在字符串的末尾。
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char greetingEndofNull[6] = {'H','e','l','l','o'};
char greetingWithoutNull[] = "Hello";
int len1 = strlen(greetingEndofNull);
int len2 = strlen(greetingWithoutNull);
int len3 = sizeof(greetingEndofNull);
int len4 = sizeof(greetingWithoutNull);
cout << greetingEndofNull <<endl;
cout << greetingWithoutNull << endl;
cout << len1 << endl;
cout << len2 << endl;
cout << len3 << endl;
cout << len4 << endl;
}
上面两个字符数组的内容是一样的。虽然第一个字符数组在定义时是6个字节,但是strlen函数在计算字符串长度时会忽略’\0’字符,因此strlen返回的值也是5。sizeof函数却不会忽略字符数组后面的结束字符,它返回则是6。
2.C++中的string类
C++提供了一个得到极大改善的字符串概念,并作为标准库的一部分提供了这个字符串的实现。在C++中,std::string是一个类(实际上是basic string模板的一个实例),这个类支持中提供的许多功能,还自动管理内存分配。string类在std名称空间的头文件中定义。
2.1string字面量
字符串字面量通常解释为const char*。使用用户定义的标准字面量’s’可以把字符串字面量解释为std::string.例如:
#include <iostream>
using namespace std;
int main(){
auto str1 = "Hello World";
auto str2 = "Hello World"s;
if(typeid(str1) == typeid(const char*)){
cout << "str1的类型是:const char*" << endl;
}
if(typeid(str2) == typeid(string)){
cout << "str2的类型是:string" << endl;
}
}
结果为:str1的类型是:const char*
str2的类型是:string
2.2 C++中字符串和数值的相互转换
2.2.1字符串转换为数值
int stoi(const string& str, size_t *idx = 0,int base = 10);
stoi函数将n进制字符串转为十进制,第二个参数是字符串起始位置,第三个参数表示n进制。也可以直接用重载的int stoi(const strin& str),默认字符串为十进制,起始位置为0。
#include <iostream>
using namespace std;
int main(){
int a = 0;
a = stoi("FEEF",0,16);
cout<< a << endl;
}
结果为
2.2.2 数值转字符串
转十进制可以用to_string,但是低版本的编译器可能不支持
#include <iostream>
using namespace std;
int main(){
int a = 10;
string str = to_string(a);
if(typeid(str) == typeid(string)){
cout << "to_string转换数字到字符串成功" << endl;
}
}
转多进制还可以用stringstream
在使用stringstream的时候需要引入头文件sstream,即#include.
#include <iostream>
#include <sstream>
#include <bitset>
using namespace std;
int main(){
int a = 123456;
stringstream str;
//转换为二进制
str << bitset<16>(a);
cout << str.str() << endl;
//清空str中的缓存
str.str("");
//转换为8进制
str << oct << a;
cout << str.str() << endl;
//清空缓存
str.str("");
//转换为16进制
str << hex << a;
cout << str.str() << endl;
//清空缓存
str.str("");
return 0;
}
2.3 常用字符串函数
函数 | 功能 |
---|---|
append | 将字符串添加到字符串的末尾 |
at | 返回字符串中的指定位置处的元素的引用 |
c_str | 将字符串的内容转换为C样式空终止字符串 |
data | 转换为字符数组的字符串内容 |
empty | 测试是否该字符串包含字符 |
erase | 从指定位置字符串中一处元素或某个范围的元素 |
find | 与指定的字符序列匹配子字符串的第一个匹配项的向前搜索字符串 |
find_first_not_of | 搜索与指定任何字符元素匹配的第一个字符的字符串 |
find_first_of | 搜索指定任何的字符串元素相匹配的第一个字符的字符串 |
rfind | 向后方向中的首次出现的与指定的字符序列匹配的子字符串搜索字符串 |
pop_back | 清除该字符串的最后一个元素 |
push_back | 该字符串的末尾添加一个元素 |
insert | 将某个原色的数目或某个范围的元素插入到指定位置的字符串 |
length | 返回字符串的元素的当前数目 |
replace | 替换指定的字符或从其他趋于或字符串或C字符串复制的字符在字符串中位于指定位置处的元素 |
substr | 从指定位置的字符串开头的复制的子字符串的最大字符数 |
2.4 原始字符串字面量
原始字符串字面量是可以横跨多行代码的字符串字面量,不需要转义嵌入的双引号,像\t和\1!这种转义序列的方式处理,而是按照普通文本的方式处理。例如:
string str = "Hello \"World\"!";//error
string str = R"(Hello "World"!)";//right
可以跨多行代码。例如:
string str = "Line 1
Line 2 with \t"; // Error!
string str = R"(Line 1
Line 2 with \t)";//right
版权声明:本文参考CSDN博主「wrdasj」的原创文章,
原文链接:https://blog.csdn.net/weixin_41256281/article/details/90581453