文章

【GESP/CSP】编程武器库-1, 字符类型判断

开篇语:

在之前做题的过程中,我发现有很多题目都会有一些共同的小的功能逻辑,比如判断一个字符是否为数字、字母、空格;字符串的大小写转换以及数字的进制转换等。

这部分的逻辑和代码其实是通用的、可复用的。掌握这部分技能,对每个等级的考生来说,就好像在逐步丰富你的“武器库”,“武器库”足够强大,可大大加快解题速度。

在之前做题的过程中,我就打算抽空逐步整理、总结这部分“技能”,今天终于抽出时间决定开始,本系列今天正式启动。

本人也是边学、边实验、边总结。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。

在之前做过的【GESP】C++三级练习luogu-B3640 T3 句子反转【GESP】C++三级练习 luogu-B2117 整理药名等题目中,都涉及到对单个字符进行是否是数字、字母或大小的判断的逻辑。这部分代码理论上是通用的,是你应该掌握的必备技能。今天我们就来详细了解一下这部分技能,开始丰富你的”武器库“。


一、判断字符是否是数字(0-9)

方法一,手动编码

手动编码永远是最直接的方法,但记不住内置函数的时候,可以选择手动编码。

1
2
3
4
// 判断字符是否为数字的函数
bool isNumber(char c) {
    return c >= '0' && c <= '9';
}

应用样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

// 判断字符是否为数字的函数
bool isNumber(char c) {
    return c >= '0' && c <= '9';
}

int main() {
    char c = '7';
    if (isNumber(c)) {
        cout << c << " 是数字" << endl;
    } else {
        cout << c << " 不是数字" << endl;
    }
    return 0;
}

输出:

1
7 是数字

方法二,使用内置 isdigit 函数

C++ 标准库提供了 <cctype> 头文件,其内定义了一系列常用的字符判断函数。其中就包括判断字符是否是数字的isdigit函数。

  • isdigit(c) → 如果 c 是 0~9 的数字字符,返回非 0(true)。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cctype>
using namespace std;

int main() {
    char c = '7';
    if (isdigit(c)) {
        cout << c << " 是数字" << endl;
    } else {
        cout << c << " 不是数字" << endl;
    }
    return 0;
}

输出:

1
7 是数字

二、判断字符是否是字母(英文a~z或A~Z)

方法一,手动编码

1
2
3
4
// 判断字符是否为字母的函数
bool isLetter(char c) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

应用样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

// 判断字符是否为字母的函数
bool isLetter(char c) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

int main() {
    char c = 'A';
    if (isLetter(c)) {
        cout << c << " 是字母" << endl;
    } else {
        cout << c << " 不是字母" << endl;
    }
    return 0;
}

输出:

1
A 是字母

方法二,使用内置 isalpha 函数

C++ 标准库 <cctype> 头文件中定义了判断字符是否是字母的isalpha函数。

  • isalpha(c) → 如果 c 是 A~Z 或 a~z,返回 true。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cctype>
using namespace std;

int main() {
    char c = 'A';
    if (isalpha(c)) {
        cout << c << " 是字母" << endl;
    } else {
        cout << c << " 不是字母" << endl;
    }
    return 0;
}

输出:

1
A 是字母

三、判断字符是否是大写字母(A~Z)

方法一,手动编码

1
2
3
4
// 判断字符是否为大写字母的函数
bool isUpperCase(char c) {
    return c >= 'A' && c <= 'Z';
}

应用样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

// 判断字符是否为大写字母的函数
bool isUpperCase(char c) {
    return c >= 'A' && c <= 'Z';
}

int main() {
    char c = 'A';
    if (isUpperCase(c)) {
        cout << c << " 是大写字母" << endl;
    } else {
        cout << c << " 不是大写字母" << endl;
    }
    return 0;
}

输出:

1
A 是大写字母

方法二,使用内置 isupper 函数

C++ 标准库 <cctype> 头文件中定义了判断字符是否是大写字母的isupper函数。

  • isupper(c) → 如果 c 是 A~Z,返回 true。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cctype>
using namespace std;

int main() {
    char c = 'A';
    if (isupper(c)) {
        cout << c << " 是大写字母" << endl;
    } else {
        cout << c << " 不是大写字母" << endl;
    }
    return 0;
}

输出:

1
A 是大写字母

四、判断字符是否是小写字母(a~z)

方法一,手动编码

1
2
3
4
// 判断字符是否为小写字母的函数
bool isLowerCase(char c) {
    return c >= 'a' && c <= 'z';
}

应用样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

// 判断字符是否为小写字母的函数
bool isLowerCase(char c) {
    return c >= 'a' && c <= 'z';
}

int main() {
    char c = 'a';
    if (isLowerCase(c)) {
        cout << c << " 是小写字母" << endl;
    } else {
        cout << c << " 不是小写字母" << endl;
    }
    return 0;
}

方法二,使用内置 islower 函数

C++ 标准库 <cctype> 头文件中定义了判断字符是否是小写字母的islower函数。

  • islower(c) → 如果 c 是 a~z,返回 true。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cctype>
using namespace std;

int main() {
    char c = 'a';
    if (islower(c)) {
        cout << c << " 是小写字母" << endl;
    } else {
        cout << c << " 不是小写字母" << endl;
    }
    return 0;
}

输出:

1
a 是小写字母

四、总结

  1. 推荐使用 <cctype> 的内置函数,因为它们更直观、可读性更好。

    • isdigit → 数字
    • isalpha → 字母
    • isupper / islower → 大小写
  2. 手动 ASCII 范围判断 更灵活,但代码可读性稍差。当你在考场忘记内置函数写法或者需要一些自定义规则的时候使用。

  3. <cctype> 中还有很多其他的判断函数,如 isspace(判断空格)、isalnum(判断字母或数字)等。本质就是针对ASCII表中特定范围的字符,分类判断,这里不做展开。当真正用道时,我们再考虑总结。

总之,本次我们武器库更新了字符判断是否是数字、字母、大写、小写。4个技能,后续我们将跟随问题,逐步更新。


附、当前武器库清单

分类功能教程
字符判断判断是否为数字(0-9)【GESP/CSP】编程武器库-1, 字符类型判断
字符判断判断是否为字母(a-z/A-Z)【GESP/CSP】编程武器库-1, 字符类型判断
字符判断判断是否为大写字母(A-Z)【GESP/CSP】编程武器库-1, 字符类型判断
字符判断判断是否为小写字母(a-z)【GESP/CSP】编程武器库-1, 字符类型判断

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权