1.错误检查
函数执行失败时,一般都会返回一个特定的值,比如-1,空指针等等。这些值只能说明有错误发生,而不能指出错误的原因。头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误信息的描述。
程序开始执行时,变量errno被初始化为0,。很多库函数在执行过程中遇到错误就会将errno设置为相应的错误码。注:不能根据errno的值来判断一个函数是否正常执行。
例程
#include<stdio.h> #include<stdlib.h> #include<errno.h> int main() { FILE *fp; char *filename = "only_root.txt"; errno = 0; fp = fopen(filename, "r"); if(fp == NULL) printf("open file %s failed, error is %d\n", filename, errno); else printf("open file %s successfully!\n", filename); }
运行结果
2对应错误码ENOENT,得到出错原因是文件或目录不存在。
附一个errno错误码对照表链接
https://blog.csdn.net/ylwdi/article/details/24628927
2.错误的提示信息
当程序出现错误时,应当打印相应的错误提示信息,以便程序员发现并修改错误。函数strerror和perror可以通过错误码获取标准的错误信息提示。
strerror函数在头文件string.h中声明。
#include<string.h> char *strerror(int errnum);
strerror函数根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针。errnum的值通常就是errno。
perror函数声明在头文件stdio.h中。
#include<stdio.h> void perror(const char *massage);
perror打印错误信息到stderr,stderr在Linux中通常就是屏幕或命令行终端。调用perror时。若参数message是一个空指针,perror仅仅根据errno打印出对应的错误提示信息。如果提供一个非空的值,perror会把此message加在其输出信息的前面。perror会添加一个冒号和空格将message和错误信息分开,以便区分。
例程
#include<stdio.h> #include<string.h> #include<errno.h> #include<stdlib.h> FILE *open_file(char *filename) { FILE *fp; errno = 0; fp = fopen(filename, "r"); if(fp == NULL) { printf("Open file %s failed, reason is %s\n", filename, strerror(errno)); exit(-1); } else return fp; } int main() { char *filename = "ABC"; open_file(filename); return 0; }
运行结果
主程序调用open_file函数来打开文件名为ABC的文件,但是文件不存在,strerror通过errno的值将错误信息打印出来。
touch ABC后将权限更改以后再执行程序
其实这里我们可以显然发现,strerror函数就是通过对照errno表,将其后的注释打印出来
比如