#5434. 字符串笔记
字符串笔记
当前没有测试数据。
C++ 字符串操作完整笔记
目录
一、字符类型 (char) 操作
1. 基本操作
定义:
char ch;
读入方式:
cin >> ch; // 跳过空格或回车
ch = getchar(); // 读取所有字符(包括空格、回车)
scanf("%c", &ch); // 读取所有字符
输出方式:
cout << ch;
printf("%c", ch);
printf("%c\n", ch);
字符判断:
if(ch >= '0' && ch <= '9') // 判断数字
if(ch >= 'a' && ch <= 'z') // 判断小写字母
if(ch >= 'A' && ch <= 'Z') // 判断大写字母
特殊字符:
- 回车(换行)符:
'\n' - 文件结束符:
EOF
示例:逐个读入字符直到文件结束
ch = getchar();
while(ch != EOF) {
a[++n] = ch;
ch = getchar();
}
二、字符数组 (C风格字符串)
1. 定义和初始化
定义:
char a[100];
初始化方式:
// 方式1:逐个字符初始化
char c[14] = {'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't'};
// 方式2:使用字符串常量
char c[] = {"I am a student"};
// 方式3:简写形式
char c[] = "I am a student";
2. 输入输出操作
逐个字符输入输出:
for(int i = 0; i < n; i++) {
cin >> a[i]; // 或
a[i] = getchar(); // 或
scanf("%c", &a[i]);
}
整体字符串输入输出:
scanf("%s", a); // 或 scanf("%s", &a);
printf("%s", a); // 或 cout << a;
特殊用法:
scanf("%s", a + 2); // 从数组第2位开始存放字符串
// 此时只能用循环逐个输出,不能用printf整体输出
按行输入:
char s3[81];
cin.getline(s3, 80); // 读取一行,最多80个字符
3. 字符串处理函数
| 函数 | 功能 | 示例 |
|---|---|---|
strcpy(dest, src) |
字符串拷贝 | strcpy(str1, "china"); |
strcat(dest, src) |
字符串连接 | strcat(str1, str2); |
strcmp(str1, str2) |
字符串比较 | if(strcmp(a,b)==0) |
strlen(str) |
字符串长度 | cout << strlen(str); |
strlwr(str) |
大写转小写 | strlwr(str); |
strupr(str) |
小写转大写 | strupr(str); |
strcpy 示例:
char str1[10], str2[] = "china";
strcpy(str1, str2);
strncpy(str1, str2, 2); // 拷贝前2个字符
strcmp 返回值说明:
str1 == str2: 返回0str1 > str2: 返回>0str1 < str2: 返回<0
三、string 类 (C++风格字符串)
1. 基本操作
定义和初始化:
#include <string>
using namespace std;
string str; // 空串
string str("OK"); // 用C字符串初始化
string str(str1); // 拷贝构造
输入输出:
cin >> str; // 跳过空格和回车
getline(cin, str); // 读入整行(以'\n'结束)
getline(cin, str, ch); // 读入直到指定字符ch
cout << str;
2. 常用成员函数
| 函数 | 功能 | 说明 |
|---|---|---|
st.size() / st.length() |
获取长度 | 返回字符串长度 |
st.empty() |
判断空串 | 返回布尔值 |
st[i] / st.at(i) |
字符访问 | at()会检查边界 |
st.find(st2, pos) |
查找子串 | 返回位置或string::npos |
st.rfind(st1) |
反向查找 | 从后往前找 |
st.substr(pos, len) |
截取子串 | 从pos开始len个字符 |
st.erase(pos, len) |
删除子串 | 删除指定范围字符 |
st.insert(pos, str2) |
插入字符串 | 在指定位置插入 |
st.replace(pos, len, str1) |
替换子串 | 替换指定范围字符 |
st.clear() |
清空字符串 | 或 st = "" |
st.c_str() |
转C字符串 | 返回char* |
查找判断示例:
if(st.find(st1) != string::npos) {
// 找到子串
}
替换操作示例:
// 方式A:指定位置和长度
st.replace(pos, length, str1)
// 方式B:使用迭代器
replace(st.begin(), st.begin() + 5, str1);
3. 重载运算符
str1 = str2; // 赋值
str1 = str1 + str2; // 连接
str1 += str2; // 尾部连接
str1 == str2; // 相等比较
str1 != str2; // 不等比较
str1 < str2; str1 > str2; // 字典序比较
str1 <= str2; str1 >= str2;
四、字符串排序
1. 单个字符串排序
从小到大排序:
#include <bits/stdc++.h>
using namespace std;
int main() {
string st;
cin >> st;
sort(st.begin(), st.end());
cout << st;
return 0;
}
从大到小排序:
方法一:使用cmp函数
#include <bits/stdc++.h>
using namespace std;
bool cmp(char a, char b) {
return a > b;
}
int main() {
string st;
cin >> st;
sort(st.begin(), st.end(), cmp);
cout << st;
return 0;
}
方法二:使用反向迭代器
#include <bits/stdc++.h>
using namespace std;
int main() {
string st;
cin >> st;
sort(st.rbegin(), st.rend());
cout << st;
return 0;
}
部分排序(前5个字符从大到小):
#include <bits/stdc++.h>
using namespace std;
bool cmp(char a, char b) {
return a > b;
}
int main() {
string st;
cin >> st;
sort(st.begin(), st.begin() + 5, cmp);
cout << st;
return 0;
}
2. 多个字符串排序
从小到大:
#include <bits/stdc++.h>
using namespace std;
string a[4];
int main() {
for(int i = 0; i < 4; i++)
getline(cin, a[i]);
sort(a, a + 4);
for(int i = 0; i < 4; i++)
cout << a[i] << endl;
return 0;
}
从大到小:
#include <bits/stdc++.h>
using namespace std;
string a[4];
int main() {
for(int i = 0; i < 4; i++)
getline(cin, a[i]);
sort(a, a + 4, greater<string>());
for(int i = 0; i < 4; i++)
cout << a[i] << endl;
return 0;
}
五、其他常用操作
1. 字符串反转
reverse(st.begin(), st.end());
2. 统计单词数示例
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[200];
int count, i, j;
cout << "Input a string: \n";
cin.getline(s, 200);
for(count = 0, j = strlen(s), i = 0; i < j;) {
while(s[i] == ' ' && i < j) i++;
if(i < j) count++;
while(s[i] != ' ' && i < j) i++;
}
cout << "The count is: " << count << '\n';
return 0;
}
使用建议
1. 推荐使用 string 类
- 操作更方便,自动管理内存
- 重载运算符使操作更直观
- 提供丰富的成员函数
2. 字符数组注意事项
- 确保目标数组足够大
- 注意字符串结束符
\0 - 使用字符串函数时包含
<cstring>头文件
3. 头文件包含
#include <iostream> // 输入输出
#include <cstring> // C风格字符串函数
#include <string> // string类
#include <algorithm> // sort, reverse等算法
4. 内存安全
- string类自动处理内存分配
- 字符数组需要手动管理内存
- 注意缓冲区溢出问题