0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言errno、perror()和strerror()

电子工程师 来源:未知 作者:李倩 2018-11-12 15:01 次阅读

C语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。

所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。

errno、perror() 和 strerror()

C 语言提供了perror()和strerror()函数来显示与errno相关的文本消息。

perror()函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。

strerror()函数,返回一个指针,指针指向当前 errno 值的文本表示形式。

让我们来模拟一种错误情况,尝试打开一个不存在的文件。您可以使用多种方式来输出错误消息,在这里我们使用函数来演示用法。另外有一点需要注意,您应该使用stderr文件流来输出所有的错误。

#include#include#includeexternint errno ;int main (){ FILE * pf; int errnum; pf = fopen ("unexist.txt","rb"); if(pf == NULL) { errnum = errno; fprintf(stderr,"错误号: %d\n", errno); perror("通过 perror 输出错误"); fprintf(stderr,"打开文件错误: %s\n", strerror( errnum )); } else { fclose (pf); } return0;}

当上面的代码被编译和执行时,它会产生下列结果:

错误号:2通过 perror 输出错误:No such file or directory打开文件错误:No such file or directory

被零除的错误

在进行除法运算时,如果不检查除数是否为零,则会导致一个运行时错误。

为了避免这种情况发生,下面的代码在进行除法运算前会先检查除数是否为零:

#include#includemain(){ int dividend =20; int divisor =0; int quotient; if( divisor ==0){ fprintf(stderr,"除数为 0 退出运行...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr,"quotient 变量的值为 : %d\n", quotient ); exit(0);}

当上面的代码被编译和执行时,它会产生下列结果:

除数为0退出运行...

程序退出状态

通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS。在这里,EXIT_SUCCESS 是宏,它被定义为 0。

如果程序中存在一种错误情况,当您退出程序时,会带有状态值 EXIT_FAILURE,被定义为 -1。所以,上面的程序可以写成:

#include#includemain(){ int dividend =20; int divisor =5; int quotient; if( divisor ==0){ fprintf(stderr,"除数为 0 退出运行...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr,"quotient 变量的值为: %d\n", quotient ); exit(EXIT_SUCCESS);}

当上面的代码被编译和执行时,它会产生下列结果:

quotient 变量的值为:4

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    10

    文章

    1946

    浏览量

    34801
  • 函数
    +关注

    关注

    3

    文章

    4333

    浏览量

    62723

原文标题:C语言中的错误处理机制

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于linuxsocket非阻塞编程问题,server无法收到client的信息?

    ) {perror("malloc");exit (-1);}bzero(buffer,BUFFER+1);c_fd=socket(AF_INET,SOCK_STREAM,0);if(!c
    发表于 10-26 17:27

    server在非阻塞下收不到client的数据

    ) {perror("malloc");exit (-1);}bzero(buffer,BUFFER+1);c_fd=socket(AF_INET,SOCK_STREAM,0);if(!c
    发表于 10-26 17:37

    基于嵌入式Linux的网络通信系统(源代码+报告文档)

    ,errno message is '%s'\n",buf,errno,strerror(errno));break; } bzero(buf,MAXBUF+1); len=recv
    发表于 07-03 01:14

    berkeley_api到errno.h还是sys/errno.h?

    你好!没有检查这个问题是否是特定的,也影响了C32的整体。总之:在berkeley_api.c文件中,包含两个版本的errno.h。includeinclude嗯!两者都定义了EPREM的不同值
    发表于 09-24 10:35

    优秀的项目都使用最精简的设计

    ) pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno
    发表于 09-19 16:10

    C语言基础教材

    目录 C语言基础知识  C 语言简介  C 语言的特点… 
    发表于 11-24 16:20 1902次下载

    C语言简单概述

    C语言简介C语言简介C语言简介C
    发表于 11-20 14:14 0次下载

    C语言入门经典-C语言编程

    C语言入门经典-C语言编程,感兴趣的可以看看哦。
    发表于 08-16 18:54 126次下载

    C51单片机C语言与标准C语言有什么区别?

    一:C51(单片机C语言)与标准C语言的区别1、 C51语言
    发表于 10-09 08:00 134次下载
    <b class='flag-5'>C</b>51单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b>与标准<b class='flag-5'>C</b><b class='flag-5'>语言</b>有什么区别?

    单片机C语言C语言为什么有差异?

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学
    发表于 09-01 16:39 3794次阅读

    标准c语言与嵌入式,嵌入式C语言C语言的区别

    嵌入式C语言C语言的区别:最常用的系统编程语言C,它是在汇编
    发表于 10-20 14:06 6次下载
    标准<b class='flag-5'>c</b><b class='flag-5'>语言</b>与嵌入式,嵌入式<b class='flag-5'>C</b><b class='flag-5'>语言</b>与<b class='flag-5'>C</b><b class='flag-5'>语言</b>的区别

    C51语言

    C51语言C51语言与标准C语言间有许多相同地方,但也有自身特点。不同的嵌入式
    发表于 11-21 15:21 26次下载
    <b class='flag-5'>C</b>51<b class='flag-5'>语言</b>

    单片机c语言+编程c语言_CC ++编程语言有什么区别?

    单片机c语言+编程c语言C & C++ are computer programming
    发表于 11-23 17:51 20次下载
    单片机<b class='flag-5'>c</b><b class='flag-5'>语言</b>+编程<b class='flag-5'>c</b><b class='flag-5'>语言</b>_<b class='flag-5'>C</b>和<b class='flag-5'>C</b> ++编程<b class='flag-5'>语言</b>有什么区别?

    单片机c语言+编程c语言_C编程语言简介

    单片机c语言+编程c语言In this tutorial you will get basic introduction to C prog
    发表于 11-29 10:21 38次下载
    单片机<b class='flag-5'>c</b><b class='flag-5'>语言</b>+编程<b class='flag-5'>c</b><b class='flag-5'>语言</b>_<b class='flag-5'>C</b>编程<b class='flag-5'>语言</b>简介

    C语言进阶】C语言指针的高阶用法

    C语言进阶】C语言指针的高阶用法
    的头像 发表于 08-31 13:24 2347次阅读