关于ASCII
字符数字转整数
1 2 |
string a="1010"; int num = a[0] - '0'; |
数字转字符数字
1 |
char c = 1 + '0'; |
字符与大小写转换
- 转大写
1 |
char upper = ch - 'a' + 'A'; |
1 |
char upper = ch & 0xDF; |
- 转小写
1 |
char lower = ch - 'A' + 'a'; |
1 |
char lower = ch | 0x20; |
字符与十六进制转换
- 字符到十六进制
- 如果字符是
'0'
到'9'
或'A'
到'F'
,可以通过条件判断来将字符转换为对应的十六进制值
- 如果字符是
- 十六进制到字符
- 将
0
到15
的整数值转换为十六进制字符,通过条件判断或直接查表实现
- 将
1 |
char hex_digit = (value < 10) ? (value + '0') : (value - 10 + 'A'); |
字符串与整数转换
std::stoi
std::to_string
数字字母判断
std::isdigit(ch)
- 检查字符是否是数字字符(
'0'
到'9'
)
- 检查字符是否是数字字符(
std::isalpha(ch)
- 检查字符是否是字母字符(包括大小写)
字符拼接
1 2 |
std::string str = "Hello"; str += '!'; |
计算字符距离
1 |
int distance = 'z' - 'a'; // 25 |
关于数组
初始化相关
- 对数组不初始化,是随机值
- 取决于内存中的先前内容
1 2 3 |
int pos[26]; //0x000000bca24ff5c8 {-858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, ...} |
- 对数组初始化为
0
1 2 3 |
int pos[26] = 0; // 0x00000039c5f2f6f8 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} |
- 对数组初始化为
-1
1 2 3 |
int pos[26] = -1; // 0x000000b5e5cff478 {-1, 0, 0, 0, 0, 0, 0, 0, 0, 0} |
- 总结:
- 将数组初始化为
{0}
,这意味着显式地将第一个元素初始化为0
- 而
C
语言规定其余的元素如果未显式初始化,则会自动初始化为0
- 将数组初始化为
1 2 3 4 5 6 7 8 |
int arr[10]; for(int i = 0; i < 10; i++) { arr[i] = -1; } #include <string.h> int arr[10]; memset(arr, -1, sizeof(arr)); // 这将每个字节都设置为0xFF,但需要注意与int的兼容性 |
关于语法
return
和exit()
-
return
-
用于终止当前函数的执行,并将控制权返回给调用该函数的地方
-
return
只能用于函数内部,结束当前函数的执行 -
在
main()
函数中,return
用于终止程序的执行,并将一个状态码(通常是0
或非0
的整数)返回给操作系统将状态码传递给操作系统,但不会影响全局的静态对象的清理和文件缓冲区的刷新
同时触发全局对象和静态对象的析构
-
-
exit
- 是一个库函数,定义在
<stdlib.h>
中,用于立即终止整个程序的执行 exit()
会结束当前程序,并将一个状态码传递给操作系统,通常用于指示程序是否正常退出(0
表示正常,非0
表示异常)exit()
可以在程序的任何地方调用,不仅限于main()
函数或其他特定的函数
调用exit()
后,程序不再继续执行后续的任何代码exit()
会调用所有注册的atexit()
函数、刷新所有打开的文件缓冲区,并释放所有分配的内存
终止所有活跃的子线程,并执行任何静态对象的清理和全局对象的析构函数
- 是一个库函数,定义在
-
总结
return
仅限于函数内部
结束当前函数,返回控制权给调用者
返回状态码,继续执行调用者的代码
main()
返回时刷新文件缓冲区和清理静态对象
常用于返回函数结果或结束main()
exit()
可在程序的任何地方调用
立即结束整个程序
终止所有执行,调用atexit()
注册的函数
刷新文件缓冲区,清理静态对象,调用析构函数
常用于异常处理、错误退出或非正常终止
atexit
- 概述
- 是
C
标准库中的一个函数,定义在<stdlib.h>
头文件中 - 用于注册一个函数,这个函数将在程序正常终止时自动执行
- 通过
atexit()
,程序可以在退出时执行一些清理操作,比如释放资源、关闭文件、保存日志等
- 是
- 原型
- 成功时返回
0
,如果注册失败则返回非零值
- 成功时返回
1 2 3 |
#include <stdlib.h> int atexit(void (*func)(void)); |
- 作用
atexit()
用于在程序正常终止时执行特定的清理操作- 程序正常终止指,通过
return
结束main()
、调用exit()
函数等
- 注册函数的执行时机
- 注册的函数在程序正常退出时被调用(通过
exit()
、return
离开main()
或其他标准方法) - 如果程序通过
_exit()
或abort()
或异常方式(如程序崩溃、异常终止)退出,则不会调用atexit()
注册的函数
- 注册的函数在程序正常退出时被调用(通过
- 最大注册数量
- 标准库对
atexit()
可以注册的函数数量有一个限制 - 具体数量取决于实现(通常不少于
32
个) - 过多的注册可能会导致注册失败
- 标准库对
- 执行顺序
- 如果多次调用
atexit()
注册多个函数,这些函数会以后注册先执行(LIFO
:Last In, First Out
)的顺序执行
- 如果多次调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <stdio.h> #include <stdlib.h> void cleanup1() { printf("Cleanup function 1 called.\n"); } void cleanup2() { printf("Cleanup function 2 called.\n"); } int main() { // 注册两个清理函数 if (atexit(cleanup1) != 0) { fprintf(stderr, "Failed to register cleanup1\n"); return 1; } if (atexit(cleanup2) != 0) { fprintf(stderr, "Failed to register cleanup2\n"); return 1; } printf("Main function executed.\n"); return 0; // 正常结束,触发 atexit 注册的函数 } |
1 2 3 |
Main function executed. Cleanup function 2 called. Cleanup function 1 called. |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ X86_64汇编学习记述四08/09
- ♥ C标准库_cctype12/15
- ♥ 【AcWing 语法基础课 第三讲】02/22
- ♥ 51CTO:C++网络通信引擎架构与实现一09/09
- ♥ Windows 核心编程 _ 线程调度07/07
- ♥ 【LeetCode-Aug】08/10