全面复习linux C语言系列--第四讲--程序调试
?
出错处理
?
?1.使用标准错误输出
?
例子: 判断键盘上输入的字符是不是 0-9
?
#include <stdio.h>main(){ char ch; scanf("%c",&ch); if(!isdigit(ch)) {???????????? fprintf(stderr,"Please input a digit char\n");? }}?
打印errno的值:
?
printf("errno is: %d\n",errno);
?2.使用errno全局变量 ,errno中的内容应该在出错后立即使用,因为出错后不立即使用,可能在调用其他函数时又产生了错误,导致errno的原有值呗覆盖!
?
a. 使用? perror
#include <stdio.h>main(){ FILE *fp; if((fp = fopen("./test.txt","r")) == NULL) { perror("fopen"); return; } printf("Open file success!\n"); fclose(fp); return;}?
b. 使用全局变量 erron
?
#include <stdio.h>#include <errno.h>main(){ FILE *fp; if((fp = fopen("./test.txt","r")) == NULL) { fprintf(stderr,"fopne faild%s\n",strerror(errno)); return; } printf("Open file success!\n"); fclose(fp); return;}?
?3.使用出错信号处理 : 使用标准错误输出和errno变量进行错误处理,都是在可以预知的情况下进行的错误处理,所以预先编码进行错误处理,除此之外还有一种错误,是编码人员不知道何时会出现异常,此时就可以使用信号进行错误处理
?
例子:在被0除 的情况下,系统内核将向进程发送信息SIGFPE,编程人员可以在程序中捕获该信号进行处理
?
#include <stdio.h>#include <errno.h>#include <signal.h>void Handle_Sigfpe(int signo){ fprintf(stderr,"%d\n",signo);fprintf(stderr,"catch the signal!\n`"); exit(0);}main(){ int i,m,n; if(signal(SIGFPE,Handle_Sigfpe) == SIG_ERR) { perror("signal"); return; } for(i=0;i<10;i++) { scanf("%d %d",&m,&n); printf("%d / %d = %d\n",m,n,m/n); }}?
?
?4.使用assert断言
?
#include <stdio.h>#include <assert.h>#include <stdlib.h>int main( void ){ FILE *fp; fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" ); //以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //这里出错 fclose( fp ); //该语句将不会执行 return 0;}?
?5.内存泄露的检查
?6.其他可能的内存错误
?
?
??