
C++ string 类的常用函数及相关工具的详细总结,按功能分类整理,附代码示例:
函数 | 功能描述 | 示例代码 |
|---|---|---|
s.length() | 返回字符串长度(字符数) | string s = "hello"; cout << s.length(); // 输出 5 |
s.empty() | 判断字符串是否为空(等价于 s.length() == 0) | if (s.empty()) { ... } |
s.clear() | 清空字符串内容 | s.clear(); // s 变为 "" |
s.resize(n, c) | 调整字符串长度为 n,新增字符用 c 填充(默认补 '\0') | s.resize(10, 'x'); // "hello" → "helloxxxxx" |
函数 | 功能描述 | 示例代码 |
|---|---|---|
s += t | 字符串拼接(追加 t 到 s 末尾) | s += "world"; // "hello" → "helloworld" |
s.append(t) | 同 +=,支持追加子串(如 s.append(t, pos, len)) | s.append("123", 1, 2); // 追加 "23" |
s.push_back(c) | 在字符串末尾添加单个字符 c | s.push_back('!'); // "hello" → "hello!" |
s.pop_back() | 删除字符串末尾的字符(C++11 起支持) | s.pop_back(); // "hello" → "hell" |
s.insert(pos, t) | 在位置 pos 插入字符串 t | s.insert(2, "xx"); // "hello" → "hexxllo" |
s.erase(pos, len) | 从位置 pos 开始删除 len 个字符(默认删到末尾) | s.erase(1, 2); // "hello" → "hlo" |
s.replace(pos, len, t) | 从位置 pos 开始的 len 个字符替换为 t | s.replace(1, 3, "XX"); // "hello" → "hXXo" |
函数 | 功能描述 | 示例代码 |
|---|---|---|
s.find(t, pos) | 从位置 pos 开始查找子串 t,返回首次出现的位置;未找到返回 string::npos | size_t idx = s.find("ll"); // 2 |
s.rfind(t, pos) | 从位置 pos 开始反向查找子串 t,返回最后一次出现的位置 | s.rfind("l"); // 3 |
s.substr(pos, len) | 截取从位置 pos 开始的 len 个字符(默认到末尾) | string sub = s.substr(1, 3); // "ell" |
s.compare(t) | 字符串比较(字典序):0 相等,负数 s < t,正数 s > t | s.compare("hello"); // 0 |
s == t / s != t | 直接比较字符串是否相等(推荐,更直观) | if (s == "hello") { ... } |
函数 | 功能描述 | 示例代码 |
|---|---|---|
s.begin() | 返回指向字符串首字符的迭代器 | for (auto it = s.begin(); it != s.end(); ++it) { cout << *it; } |
s.end() | 返回指向字符串尾字符后一位的迭代器(空终止符 '\0' 之后) | // 配合 begin() 使用 |
s.rbegin() | 返回反向迭代器,指向最后一个字符 | for (auto rit = s.rbegin(); rit != s.rend(); ++rit) { ... } |
s.rend() | 返回反向迭代器,指向第一个字符前一位 | // 用于逆序遍历 |
s[i] | 随机访问第 i 个字符(下标从 0 开始),不检查越界 | cout << s[2]; // 输出 'l' |
s.at(i) | 同 s[i],但会检查越界(越界时抛出 out_of_range 异常) | try { cout << s.at(10); } catch (const exception& e) { ... } |
函数 | 功能描述 | 示例代码 |
|---|---|---|
stoi(s, pos, base) | 将字符串 s 转换为 int 类型,pos 存储转换后的位置,base 为进制(默认 10) | int num = stoi("123"); // 123 |
stol(s) / stoll(s) | 转换为 long / long long 类型 | long num = stol("1234567890"); |
stof(s) / stod(s) | 转换为 float / double 类型 | double d = stod("3.14"); |
to_string(num) | 将数值(如 int、double)转换为字符串 | string s = to_string(123.45); // "123.450000" |
函数 | 功能描述 | 示例代码 |
|---|---|---|
tolower(c) | 将字符 c 转为小写(需包含 <cctype>) | char c = tolower('A'); // 'a' |
toupper(c) | 将字符 c 转为大写 | char c = toupper('b'); // 'B' |
批量转换 | 结合 transform 和迭代器实现 | transform(s.begin(), s.end(), s.begin(), ::tolower); // 全转小写 |
工具 | 功能描述 | 示例代码 |
|---|---|---|
stringstream | 字符串流,用于分割字符串(按空格、逗号等) | string s = "hello world"; stringstream ss(s); string word; while (ss >> word) { ... } |
getline(cin, s) | 读取一行输入(包含空格),存入字符串 s | string s; getline(cin, s); // 输入 "a b c" → s = "a b c" |
regex(正则表达式) | 复杂字符串匹配与替换(需包含 <regex>) | regex pattern("\\d+"); string s = regex_replace("a1b2c3", pattern, "X"); // "aXbXcX" |
达达想要统计一下电子版的日记已经写了多少字,请你帮助他解决问题。
输入一行,一个字符串,字符串中可能包含空格。
输出一行,一个整数,表示字符串所包含字符的个数。
Today is a very beautiful day.
30
#include <iostream>
#include <string>
using namespace std;
int main(){
// 定义变量
string str;
// 获取
getline(cin,str);
// 输出
cout << str.size();
return 0;
}输入一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成),分别统计出其中大写英文字母,小写英文字母、阿拉伯数字和空格的个数。
一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成)
分别输出大写英文字母,小写英文字母、阿拉伯数字和空格的个数,用空格隔开
输入
h0u84nfx 7
输出
0 5 4 1
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main(){
string str;
int x_cnt=0,d_cnt=0,n_cnt=0;
getline(cin,str);
int len = str.size();
for (int i = 0; i < len; i++) {
if(str[i]>='a'&& str[i]<='z'){
x_cnt++;
}
else if(str[i]>='A'&& str[i]<='Z'){
d_cnt++;
}
else if(str[i]>='0'&& str[i]<='9'){
n_cnt++;
}
}
printf("%d %d %d %d",d_cnt , x_cnt , n_cnt , len-(x_cnt+d_cnt+n_cnt));
return 0;
}达达在写日记的过程中突然发现自己漏写了一段,很是着急。但是聪明的你知道可以借助插入的方法将达达漏写的一部分内容补充到应该进行填充的位置,请你帮助达达解决这个问题。
输入共三行,第一行一个字符串,表示达达已经写好的内容。
第二行一个整数,表示内容的插入位置;
第三行一个字符串,表示要插入的内容
输出一行,一个字符串,表示插入后的内容。
TodayMonday.
5
is
TodayisMonday.
#include <iostream>
#include <string>
using namespace std;
int main(){
string str,s,str1,str2;
int n,m;
cin >> str;
cin >> n ;
cin >> s;
str2 = str.substr(n);
str1 = str.substr(0,n);
str1.append(s);
str1.append(str2);
cout << str1;
return 0;
}随着打字熟练度越来越高,达达笔记记录的速度越来越快,但是速度快的代价就是容易出现写错的情况,现在达达已经将写错的内容找到了,请你帮助他删除写错部分的内容。
输入共两行,第一行一个字符串,表示达达迅速写完的内容;
第二行两个整数,分别表示写错内容的起始位置以及写错内容的长度
输出一行,一个字符串,表示删除错误内容之后的内容。
TodayissssSaturday.
7 3
TodayisSaturday.
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
int n,m;
cin >> str;
cin >> n >> m;
cout << str.erase(n,m);
return 0;
}我们把一个以er、ly或者ing作为最后字母的单词称为不规范单词,对于这种不规范的单词我们需要将后缀部分删除掉进行规范输出,现请你写一程序进行规范输出。
输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为32)。
输出按照题目要求处理后的单词。
输入
referer
输出
refer
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
cin >> str;
int len = str.length();
// 检查以"er"结尾的情况
if(len > 2 && str.substr(len-2)=="er"){
//去除该后缀
str = str.substr(0, len - 2);
// 检查以"ly"结尾的情况
}else if(len > 2 && str.substr(len-2)=="ly"){
// 去除该后缀
str = str.substr(0, len - 2);
// 检查以"ing"结尾的情况
}else if(len > 3 && str.substr(len-3)=="ing"){
// 去除该后缀
str = str.substr(0, len - 3);
}
cout << str<< endl;
return 0;
}由于部分日记的内容是存在重复的,因此达达想要将重复的内容截取出来便于接下来写日记的时候重复使用,请你解决截取的问题。
输入共两行,第一行一个字符串,表示日记内容;
第二行两个整数,分别表示截取内容的起始位置以及截取内容的长度
输出描述
输出一行,一个字符串,表示截取出的子串内容。
I had a fun day.
8 7
fun day
#include <iostream>
#include <string>
using namespace std;
int main(){
string str,str1,str2;
int n,m;
getline(cin,str);
cin >> n>>m;
str1 = str.substr(n,m);
cout << str1;
return 0;
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。