C++学习笔记 字符串处理

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值