`
8366
  • 浏览: 797907 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

全面复习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.其他可能的内存错误

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics