C/C++教程

C++ 基础(七)操作字符串

本文主要是介绍C++ 基础(七)操作字符串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 更强大的string类

  • char类型可以存储C类字符串。cstring头文件提供了许多函数,用来处理C样式的字符串。这样的字符串本质上不安全。
  • string类型,是复合类型。

 

2. 定义string对象

  • 定义string:
    • std::string empty;
    • std::string proverb {"Many a mickle."};
    • std::string part_literal {"Least said", 3};  //从字符串字面量中提取3个初始化
    • std::string phase { proverb, 0, 13};  //使用proverb的从0开始到13个字符初始化phase。
  • c_str()可以得到一个类型为const char *的C字符串。
  • C++17中定义data()函数可以得到一个char *的C字符串。
  • length()方法返回string对象字符串长度。

 

3. string对象的操作

  • 连接字符串
    • 两个字符串字面量之间不能使用 + 号,使用省略 + 号的方式连接。
    • 可以使用 + 号连接字符串,一个操作数必须是string。
    • 通过给字符串字面量加s的方式转为string类,例如:"whipper"s
    • 使用append()函数连接,代替+=运算符,更加灵活。
  • 连接字符串和字符
    • + : 不能将两个字符串连接起来,+ 的一个操作数必须是string。
    • 字符串转ASCII模式的加法模式:
      • sentence += second + ',' + ' ' + first;   // rigth
      • sentence += ',' + ' ';     // Note:',' 和 ' ' 或先计算得到 'L' ,此时不会连接两个字符,反而是把两个字符的ASCII加起来
  • 连接字符串和数字
    • string头文件中的std::to_string()函数。
  • 字符串中的字符
    • 可以使用方括号的方式索引。
    • toupper() 字符小写转大写。
    • getline() 从键盘上获取一行,getline(std::cin, text, '#'); 先读取一行,直到遇到#停止。
  • 访问子字符串
    • substr(); 两个参数:子字符串开始的索引,子字符串的字符个数。
  • 比较字符串
    • >  >=  <  <=  ==  !=
    • 比较原则:单个字符进行比较,在前面的大;没有不同的字符,长的大;数量相同,字符相同,两字符串相等。
    • compare() 函数
      • 字符串与字符串字面量进行比较:word.compare("and"); 相等返回0,大于返回正数,小于返回负整数。
      • 比较string对象的一个子字符串和实参:
        • word1.compare(2, word2.length(), word2);  // 从word1的索引位置2开始,包含word2的长度,与word2的所有字符进行比较。
      • 比较一个string的子字符串和另一个string对象的子字符串:
        • text.compare(i, 4, phrase, 7, 4);  // text 的i位置开始4个字符,与phrase索引7开始的4个字符。
    • substr进行比较
      • 提取string的子字符串,再进行比较运算。
      • if( text.substr(i, 4) == phrase.substr(7, 4))   // 可读性更强了
  • 搜索字符串
    • find():字符串中子字符串或给定字符的索引位置。没有找到时,返回std::string::npos,在string头文件中是一个常量。注意:std::string::npos不会计算为false而是计算为true。
    • 在子字符串内搜索:
      • text.find("an", 1); 从第二个实参指定的索引位置,搜索"an",返回索引。返回的类型是size_t。
    • 搜索任意字符集合:
      • find_first_of(); 定义字符集合,在函数中查找集合,返回第一个字符出现的索引值。
      • find_last_of(); 区别:从string对象的结尾开始,逆向查找。
    • 查找不在集合中的字符:
      • find_first_not_of() 和 find_last_not_of()
  • 逆向搜索字符串
    • find()从前往后搜索,rfind()从后向前搜索,参数在string对象中最后一次出现的位置。
    • 没有找到时,返回std::string::npos。
  • 修改字符串
    • 插入字符串
      • phrase.insert(14, words);  // 索引位置为14的前面插入words
      • phrase.insert(13, words, 8, 5); // word从第8位置开始的5个字符的子字符串放到phrase的第13个索引位置前。
    • 替换子字符串
      • text.replace(13, 5, "Gruntfuttock");  // text 从索引位置13开始的5个字符替换为"Gruntfuttock"。
      • text.replace(start, end-start, name, 5, 12);  // start索引开始,长度是end-start,替换name的5~12的字符。
      • text.replace(start, end-start, 3, '*'); //替换的字符串由重复指定次数的指定字符组成。
  • 删除字符串中的字符
    • text.erase(0, 6);  // 要删除字符的索引位置和长度
    • text.erase(5);  // 删除前5个字符
    • text.erase();    // 删除所有字符
    • text.clear();     // 删除所有字符
  • 对比std::string与std::vector<char>
    • std::string 支持 std::vector<char>几乎所有成员函数。
    • vector的push_back,string使用 +, += 语法。
    • string 提供了at()函数,比[]更加强大,提供了边界检查的能力。
    • string 提供了size()函数,对应的vector<>提供了length()函数。
    • string 提供了front()和back()函数,用于访问第一个和最后一个字符。
    • string 提供了一系列的assign()函数重新初始化。

 

4. 将字符串转为数字

  • string头文件提供了std::stoi()函数
  • 类似的:stol(),stoll(),stoul(),stoull(),stof(),stod(),stold()

 

5. 字符串流

  • 对字符串进行格式化或更复杂的输出。
  • 标准库提供了特殊的流,将字符收集到string中。std::stringstream,定义在sstream头文件中。
  • 实例:
    • std::stringstream ss;  ss << std::setprecision(4) << std::setw(7) << std::right << values[i];

 

6. 国际字符串

  • std::wstring 对象,包含wchar_t类型字符串。
  • std::u16string对象,包含16位Unicode字符串,类型是char16_t。
  • std::u32string对象,包含32位Unicode字符串,类型是char32_t。
  • 存储wchar_t字符的字符串:
    • std::wstring 类型存储wchar_t。
    • std::wstring saying {L "The light" };  //定义
    • std::wcout << saying << std::endl;   //输出
  • 包含Unicode字符串的对象
    • UTF-16 std::u16 string 类型的对象存储,char16_t 类型的字符串,字符串字面量前加上u。
    • UTF-32 std::u32 string 类型的对象存储,char32_t 类型的字符串,字符串字面量前加上U。
    • UTF-8   std::string        类型的对象存储,字符串前面加上u8。u8"This is a UTF-8 string."。

 

7. 原始字符串字面量

  • 转义字符:换行:\n    制表符:\t  定义的字符串需要包含多个这种特殊字符时,会需要连续转义。
  • 引入原始字符串解决这个问题:
    • 原始字符串字面量基本形式是R"(....)",不同类型的字符串,在R前面加上前缀L,u,U...
  • 可以使用char_sequence的方式标记字面量的开始和结束
    • 也就是开始和结束使用相同的序列,例如:R"Fa-la (The answeris "(a-b)")Fa-la"
  • 限制是char_sequence不能超过16个字符,且不能包含圆括号,空格,控制字符,反斜杠。

 

这篇关于C++ 基础(七)操作字符串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!