003 C++的字符类型(Character Types)
作者Lou Xiao, deepseek创建时间2025-04-02 06:51:15更新时间2025-04-02 06:51:15
1. 基本字符类型
1.1 char
大小: 通常1字节(8位)
范围:
- 有符号: -128 到 127
- 无符号: 0 到 255
用途: 存储ASCII字符或小整数
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char ch = 'A';
2
char num = 65; // 等同于'A'的ASCII码
1.2 wchar_t
大小: 实现定义(通常2或4字节)
用途: 存储宽字符,用于扩展字符集
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
wchar_t wch = L'你';
1.3 char16_t (C++11)
大小: 2字节(16位)
用途: UTF-16编码的Unicode字符
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char16_t utf16ch = u'好';
1.4 char32_t (C++11)
大小: 4字节(32位)
用途: UTF-32编码的Unicode字符
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char32_t utf32ch = U'😊';
2. 字符字面量
类型 | 前缀 | 示例 | 说明 |
---|---|---|---|
char | 无 | 'A' | ASCII字符 |
wchar_t | L | L'你' | 宽字符 |
char16_t | u | u'字' | UTF-16字符 |
char32_t | U | U'🐱' | UTF-32字符 |
转义序列 | 无 | '\n', '\x41' | 特殊字符表示 |
3. 转义序列
3.1 常用转义序列
\n
: 换行\t
: 水平制表符\\
: 反斜杠\'
: 单引号\"
: 双引号\0
: 空字符(null)
3.2 数字转义序列
\xhh
: 十六进制表示(如'\x41'是'A')\ooo
: 八进制表示(如'\101'是'A')
4. 字符处理函数(<cctype>
)
函数 | 描述 |
---|---|
isalnum(c) | 检查是否为字母或数字 |
isalpha(c) | 检查是否为字母 |
isdigit(c) | 检查是否为数字 |
islower(c) | 检查是否为小写字母 |
isupper(c) | 检查是否为大写字母 |
tolower(c) | 转换为小写 |
toupper(c) | 转换为大写 |
isspace(c) | 检查是否为空白字符 |
4.2 字符比较
- 可直接使用关系运算符:
==
,!=
,<
,>
等 - 比较基于字符的ASCII码值
5. 字符与整数关系
字符本质上是小整数
5.1 隐式转换
- 较小的整数类型可以隐式转换为较大的整数类型
- 字符类型可以隐式转换为整数类型
5.2 显式转换
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char c = 'A';
2
int i = static_cast<int>(c); // C++风格转换
3
int j = (int)c; // C风格转换
可进行算术运算:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char c = 'A';
2
c = c + 1; // c现在为'B'
类型转换:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
int i = 'A'; // i = 65
2
char c = 65; // c = 'A'
6. 字符串与字符数组
6.1 C风格字符串
以空字符('\0')结尾的字符数组
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char str[] = "Hello"; // 自动添加'\0'
2
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
6.2 std::string (C++字符串类)
更安全方便的字符串处理
示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <string>
2
std::string s = "Hello";
3
s += '!'; // 添加字符
7. Unicode支持(C++11及以后)
7.1 编码前缀
- UTF-8:
u8
(如u8"你好"
) - UTF-16:
u
(如u"你好"
) - UTF-32:
U
(如U"你好"
) - 宽字符:
L
(如L"你好"
)
7.2 Unicode字面量
通用字符名: \uXXXX
(16位) 或 \UXXXXXXXX
(32位)
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char32_t heart = U'\U00002764'; // ❤
7.3 字符编码注意事项
- ASCII:标准7位编码(0-127)
- 扩展ASCII:使用8位(0-255)
- UTF-8:可变长度Unicode编码(1-4字节)
- UTF-16:16位Unicode编码
- UTF-32:32位Unicode编码
8. 字符类型选择指南
使用场景 | 推荐类型 |
---|---|
ASCII字符处理 | char |
本地化宽字符(Windows) | wchar_t |
跨平台Unicode(16位) | char16_t |
跨平台Unicode(32位) | char32_t |
现代C++字符串处理 | std::string |
9. 最佳实践
- 明确字符类型的符号性:
signed char sc; unsigned char uc;
- 处理国际化文本时使用
char16_t
或char32_t
- 优先使用
std::string
和std::wstring
而非C风格字符串 - 处理Unicode时明确指定编码类型,进行字符操作时考虑本地化设置
- 使用标准库函数而非手动处理字符转换
- 使用
static_cast
进行显式字符类型转换
10. 常见陷阱
10.1. 有符号/无符号混淆:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char c = 200; // 可能溢出(如果char是有符号的)
10.2 忘记空终止符:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char str[] = {'H', 'i'}; // 不是有效的C字符串
10.3 窄/宽字符混淆:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
std::string s = L"宽字符"; // 错误类型
10.4 区域设置影响:
isalpha()
等函数的结果可能依赖区域设置
10.5 UTF-8多字节字符:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
char u8str[] = u8"你好";
2
// sizeof(u8str) != 字符数(因为UTF-8是多字节编码)
11. 示例代码
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <iostream>
2
#include <cctype>
3
#include <string>
4
5
int main() {
6
// 基本字符类型
7
char c = 'A';
8
wchar_t wc = L'你';
9
char16_t c16 = u'字';
10
char32_t c32 = U'🐱';
11
12
// 字符串字面量
13
const char* str = "Hello";
14
const wchar_t* wstr = L"你好";
15
const char16_t* str16 = u"UTF-16";
16
const char32_t* str32 = U"UTF-32";
17
18
// 字符处理
19
std::cout << "isalpha('A'): " << isalpha('A') << '\n';
20
std::cout << "tolower('A'): " << (char)tolower('A') << '\n';
21
22
// 原始字符串
23
const char* raw_str = R"(Line1\nLine2)"; // 包含字面\n
24
25
return 0;
26
}
文章目录