#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: 返回 0
  • str1 > str2: 返回 >0
  • str1 < 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类自动处理内存分配
  • 字符数组需要手动管理内存
  • 注意缓冲区溢出问题