本文主要是介绍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++ 基础(七)操作字符串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!