• C++
  • 字符串处理学习笔记教程

  • @ 2025-7-29 20:24:28

字符串处理学习笔记教程

一、前言

恭喜你开启字符串处理学习之旅!字符串操作在编程里超实用,像统计字符、大小写转换、判断相等,都是常见又重要的任务。接下来咱们结合 OpenJudge 题目,一步步掌握这些技能,代码都有详细注释,别怕看不懂,跟着学就好,你肯定能学会!

二、知识模块与实践

(一)统计数字字符个数(题目01)

题目需求:输入一行字符,数出其中数字字符(0 - 9 )的个数。
核心思路:逐个遍历字符,判断是否在 '0''9' 范围,是就计数。

#include<iostream>
#include<string>
using namespace std;

int main() {
    string str; 
    int cnt = 0; // 用来存数字字符个数,初始化为0
    getline(cin, str); // 读入一行字符串,包含空格也能读
    int len = str.size(); // 获取字符串长度
    for (int i = 0; i < len; i++) { 
        // 判断字符是否是数字,'0'到'9'是数字字符的ASCII范围
        if (str[i] >= '0' && str[i] <= '9') { 
            cnt += 1; // 是数字就计数加1
        }
    }
    cout << cnt; // 输出数字字符总数
    return 0;
}

学习要点getline 读整行、str.size() 取长度、字符范围判断,这些基础操作得记牢,往后处理字符串经常用!

(二)小写字母转大写字母(题目13)

题目需求:把字符串里所有小写字母转成大写。
核心思路:遍历字符,若为小写('a' - 'z' ),利用 ASCII 码差值转大写(大写比对应小写小 32 ,也可用 'a' - 'A' 算差值 )。

#include<iostream>
using namespace std;

int main() {
    string s; 
    getline(cin, s); // 读入带空格的字符串
    int len = s.size(); 
    for (int i = 0; i < len; i++) { 
        // 判断是否是小写字母
        if (s[i] >= 'a' && s[i] <= 'z') { 
            // 小写转大写,'a'-'A' 是 32,减去它就转成大写
            s[i] = s[i] - ('a' - 'A'); 
        }
    }
    cout << s << endl; // 输出转换后的字符串
    return 0;
}

学习要点:字符本质是 ASCII 码,通过算术运算能转换大小写,记住 'a' - 'A' 这个差值,处理字母大小写超方便!

(三)字符串判等(题目17,忽略大小写和空格)

题目需求:判断两个字符串,忽略大小写和空格后是否相等,相等输出 YES ,否则 NO
核心思路:先统一处理两个字符串(转小写/大写、去掉空格 ),再比较处理后的内容。

#include<iostream>
#include <algorithm> 
using namespace std;

int main() {
    string s1, s2; 
    getline(cin, s1); 
    getline(cin, s2); 

    // 处理 s1:大写转小写(和 s2 统一处理方式)
    for (int i = 0; i < (int)s1.size(); i++) { 
        if (s1[i] >= 'A' && s1[i] <= 'Z') { 
            // 大写转小写,加上 'a'-'A'(32)
            s1[i] = s1[i] + ('a' - 'A'); 
        }
    }

    // 处理 s2:用 transform 函数转小写,更简洁(也能遍历转,选顺手的方式)
    transform(s2.begin(), s2.end(), s2.begin(), ::tolower); 

    // 去掉 s1、s2 的空格,存到新字符串
    string s11 = "", s22 = ""; 
    for (int i = 0; i < (int)s1.size(); i++) { 
        if (s1[i] != ' ') { // 不是空格就拼接到 s11
            s11 += s1[i]; 
        }
    }
    for (int i = 0; i < (int)s2.size(); i++) { 
        if (s2[i] != ' ') { // 不是空格就拼接到 s22
            s22 += s2[i]; 
        }
    }

    // 比较处理后的字符串
    if (s11 == s22) { 
        cout << "YES" << endl; 
    } else {
        cout << "NO" << endl; 
    }
    return 0;
}

学习要点:处理字符串判等,要先统一规则(大小写、空格 )。transform 是好用的工具函数,能简化大小写转换;拼接字符串去空格,思路简单又实用,多练就能灵活用!

(四)找第一个只出现一次的字符(题目02)

题目需求:给定小写字母字符串,找第一个仅出现一次的字符,没有就输出 no
核心思路:用数组(或哈希表 )统计每个字符出现次数,再遍历找第一个次数为 1 的字符。

#include<iostream>
using namespace std;

int tong[200]; // 存字符出现次数,ASCII 范围够存小写字母

int main() {
    string str; 
    cin >> str; 
    // 统计每个字符出现次数
    for (int i = 0; i < str.size(); i++) { 
        // 字符作为数组下标,次数加1
        tong[str[i]]++; 
    }
    // 找第一个出现一次的字符
    for (int i = 0; i < str.size(); i++) { 
        if (tong[str[i]] == 1) { // 次数是1,就是目标
            cout << str[i]; 
            return 0; // 找到就直接返回,保证是第一个
        }
    }
    cout << "no"; // 没找到输出 no
    return 0;
}

学习要点:统计字符频次,数组或哈希表是常用方法。这里用数组,利用字符 ASCII 码当下标,简单高效。遍历找结果时,一旦找到就返回,确保是“第一个”符合条件的,逻辑要清晰!

三、总结与激励

咱们学了字符串的遍历、字符判断、大小写转换、频次统计、复杂判等,这些都是编程基础,也是解决实际问题的“小武器”!

学习路上,遇到报错别慌,这是进步的信号;代码逻辑绕,多调试、多拆解,慢慢就清晰啦。每掌握一个小功能,都是在给自己的编程“武器库”添砖加瓦!

坚持呀!现在敲的每行代码,都是在锻炼逻辑思维,未来遇到更复杂的问题,你会发现这些基础超有用。继续加油,你会越来越厉害,用代码创造更多精彩~ 不管是解决算法题,还是写项目里的字符串处理逻辑,这些知识都能帮到你,冲就完事!

0 条评论

目前还没有评论...