目录
前言
sterror函数
perror函数
断言处理方式
前言
在错误处理一中,我们解释了C语言三种处理方式中的错误号处理方式,这一篇我们在基于上一篇的基础上加入了sterror函数与perror函数,以及断言处理方式的内容......
sterror函数
包含头文件:#include <string.h>
函数原型:void perror(const char *s);
作用:将给定的错误码转换为对应的错误消息字符串
注意事项:strerror
返回指向静态分配内存空间(全局缓冲区)中存储着结果字符串首地址的指针。因此,在多线程环境下并发调用时可能会导致竞争条件和不可预测行为。如果需要保存结果,请确保复制或拷贝该结果以避免潜在问题
常见使用方式:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {int err = EACCES; // 假设这里有一个特定的错误码char errMsg[256]; // 为了安全起见,创建一个足够大的缓冲区strncpy(errMsg, strerror(err), sizeof(errMsg) - 1); //将strerror返回的内容存放在errMsg数组中,sizeof(errMsg) - 1用于防止数组越界errMsg[sizeof(errMsg) - 1] = '\0'; // 确保数组以'\0'结尾printf("Error message: %s\n", errMsg);return 0;
}
perror函数
包含头文件:#include <stdio.h>
函数原型:void perror(const char *s);
作用:打印与当前 errno
值相关联的错误消息到标准错误流(stderr)
注意事项:perror 应该在产生错误后立即调用,否则可能会被调用其他函数覆盖
常见使用方式:
#define _CRT_SECURE_NO_WARNINGS //忽略文件操作函数不太安全的问题
#include <stdio.h>int main()
{FILE* pFile;pFile = fopen("unexist.ent", "rb");if (pFile == NULL)perror("The following error occurred");elsefclose(pFile);return 0;
}
断言处理方式
原型:void assert (int expression);
C89标准中表达式的类型必须是int
包含头文件:#include <assert.h>
作用:在代码中插入检查点,检查表达式中的内容是否为真,若不为真则中断程序
注意事项:
1、显示的内容至少包括:谁的断言失败、源文件的名称以及发生断言的行号:
Assertion failed:<断言失败的表达式>, file 文件名, line <问题所在行号>
2、在发布版本中,默认情况下编译器可能会禁用所有由 assert 引起的检查
这是因为assert会引入额外的检查,会增加程序的运行时间,在实际开发时,即使是一个很小的运行时间的增加都是不能接受的,因此一般只会在测试阶段使用assert断言,当测试完成时我们会在#include <assert.h>之前加上#define NDEBUG就可以使assert断言失效
3、不要再assert的表达式中使用副作用的表达式,包括函数调用,一旦断言失效这些表达式将不会执行
//assert断言失效后,malloc就不会执行
assert((p = malloc(n)) != NULL)
常见使用方式:
//#define NDEBUG
#include <stdio.h>
#include <assert.h>int divide(int a, int b) {assert(b != 0); // 断言:除数不能为0return a / b;
}int main() {int result = divide(10, 2);printf("Result: %d\n", result);result = divide(8, 0); // 这里会触发断言错误printf("Result: %d\n", result);return 0;
}
~over~