[cpp primer随笔] 06. 字符串

1. C++字符串 string

string是C++内置库中的字符串类型,表示一个可变长度的字符序列。其位于std命名空间中,使用时需要包含头文件。

#include 
using std::string;
string s = "abc";
  • 初始化
    string s1; // 默认初始化为空串""
    string s2 = "abc"; // 拷贝初始化
    string s3("abc"); // 直接初始化
    string s4(s3, 2); // 直接初始化(重复),值为"abcabc"
    
  • 获取大小
    size_t a = s3.size() // a = 6
    
  • 比较
    可以直接使用比较运算符进行比较,返回两个字符串自前向后依次将字符按字典序进行比较的结果。
  • 拼接
    可以直接使用 算术运算符+进行拼接。
    string s5 = s3 + s4; // "abcabcabc"
    
  • 删除
    使用erase方法可以删除字符串中的指定字符或子串,该函数所包含的三种重载形式如下所示:
    string& erase (size_t pos = 0, size_t len = npos); // 给定起始位置和删除字符数量
    iterator erase (const_iterator p); // 根据迭代器进行字符删除
    iterator erase (const_iterator first, const_iterator last); // 根据迭代器给定的范围进行删除
    

更多操作可以参考https://cplusplus.com/reference/string/string/

2. C风格字符串

本质上是一个尾部以\0空字符作为终止符的字符数组。

char a[] = "abc"; // a的长度为4, "abc\0"
char b[] = {'a', 'b', 'c'}; // b不是一个字符串,因为尾部没有终止符
char c[4] = {'a', 'b', 'c'}; // c是一个字符串,因为c指定了大小为4,

在上面的例子中,前者使用字符串字面量对字符串a进行初始化,字符串字面量其类型为const char[4],即该字面量中已经包含了尾部空字符\0;对b采用列表初始化,列表中没有在尾部添加终止符,因此b不是一个合法的字符串;而对于c而言,在声明符中明确指定数组长度为4,不以列表大小决定字符数组长度,此时没有给出的元素将初始化为0值,那么尾部的终止符相当于被自动加上。

  • 比较
    C风格字符串本质上为字符数组,若向string对象一样使用>==<等运算符进行比较的话,则数组名会被视作指针,也就是说比较的是二者地址值的大小,与初衷相悖。要想比较C风格字符串,需使用strcmp函数。当返回值为0时二者相等,当>0时则前者大,反之则后者大。
    char a[] = "abcdef";
    char b[] = "ad";
    int cmpResult = strcmp(a, b);
    if(cmpResult == 0){
    	printf("a = b");
    }else if(cmpResult > 0){
    	printf("a > b");
    }else{
    	printf("a < b");
    }
    
  • 拼接
    拼接C风格字符串,需要预先估算结果大小,并根据该大小分配一块新的字符数组空间。然后依次调用strcpystrcat将要拼接的字符串转移到结果空间中去。
    char a[] = "hello";
    char b[] = "world";
    char c[12] = {0};
    
    strcpy(c, a);
    strcat(c, ",");
    strcat(c, b);
    printf(c); // "hello,world"
    
    同时,C风格字符串支持与string混合拼接,但这是由string类型的operator+操作符重载提供的能力,因此在表达式中不能出现两个C风格符串相加的中间计算。
    string d = "hello";
    d = d + "," + b; // d "hello,world"
    d = "hello" + "," + d; // error
    

你可能感兴趣的:(C++,c++)