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

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

errno、perror() 和 strerror()

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

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

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

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

#include <stdio.h>
#include <errno.h>
#include <string.h>extern int errno ;int main ()
{FILE * pf;int errnum;pf = fopen ("unexist.txt", "rb");if (pf == NULL){errnum = errno;fprintf(stderr, "Value of errno: %d\n", errno);perror("Error printed by perror");fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));}else{fclose (pf);}return 0;
}

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

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

被零除的错误
在进行除法运算时,不检查除数是否为零,这是程序员编程时常见的问题,会导致一个运行时错误。

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

#include <stdio.h>
#include <stdlib.h>main()
{int dividend = 20;int divisor = 0;int quotient;if( divisor == 0){fprintf(stderr, "Division by zero! Exiting...\n");exit(-1);}quotient = dividend / divisor;fprintf(stderr, "Value of quotient : %d\n", quotient );exit(0);
}

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

Division by zero! Exiting...

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

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

#include <stdio.h>
#include <stdlib.h>main()
{int dividend = 20;int divisor = 5;int quotient;if( divisor == 0){fprintf(stderr, "Division by zero! Exiting...\n");exit(EXIT_FAILURE);}quotient = dividend / divisor;fprintf(stderr, "Value of quotient : %d\n", quotient );exit(EXIT_SUCCESS);
}

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

Value of quotient : 4

C语言基础教程之错误处理相关推荐

  1. c++语言基础教程第三版习题答案,《C++语言基础教程》吕凤翥习题答案

    <<C++语言基础教程>吕凤翥习题答案>由会员分享,可在线阅读,更多相关<<C++语言基础教程>吕凤翥习题答案(66页珍藏版)>请在人人文库网上搜索. ...

  2. c语言教程变量,C语言-基础教程-C语言常量与变量

    考试大计算机等级站整理: 2.2.1 标识符命名 在C语言中,标识符是对变量.函数标号和其它各种用户定义对象的命名.标识符的长度可以是一个或多个字符.绝大多数情况下,标识符的第一个字符必须是字母或下划 ...

  3. %3c- r语言运算符,R语言基础教程之运算符

    原标题:R语言基础教程之运算符 运算符类型 在R编程中有以下类型的运算符 - 算术运算符 关系运算符 逻辑运算符 赋值运算符 其他运算符1.算术运算符 下表显示了R语言支持的算术运算符.运算符对向量的 ...

  4. c语言常量类型转换,c语言基础教程常量变量和类型转换,免费版.doc

    c语言基础教程常量变量和类型转换,免费版 第二章??????常量变量和类型转换2.1.1数字常量??? 数字常量包括整型常量和浮点型常量,浮点型常量又称实数.????1.整型常量???? HYPERL ...

  5. C语言不用文件系统读取文件,C语言-基础教程-非缓冲文件系统

    前面介绍的缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符.字符串.格式化数据,也可以读写二进制数据.非缓冲文件系统依赖于操作系统,通过操作系统的功能对文 ...

  6. c语言指针地址交换程序,C语言-基础教程-指针的地址分配

    我们可以定义指针变量指向任何类型的变量.在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现.指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得 ...

  7. 计算机编程c 语言实型数据,C语言-基础教程-C语言实型数据

    C语言-基础教程-C语言实型数据 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 2.4.1 实型常量 实型常量又称浮点常量,是一个十进制表示的符号实数.符号实数的值包括整数部分. ...

  8. Go语言基础教程:版本选择

    专题目标:打造Go语言新手入门零基础免费教程 文章核心:一次只解决一个问题,用尽可能短的时间 你好,我是洋一,一个持续向上生长的互联网人. 众所周知,我们学习一门编程语言,很大程度上都离不开搭建该编程 ...

  9. R语言基础教程6:程序设计基础

    R语言基础教程1:数据类型 R语言基础教程2:散点图 R语言基础教程3:曲线图.误差线和图例 R语言基础教程4:柱形图 R语言基础教程5:图形页面排版 R语言基础教程6:程序设计基础 R语言基础教程7 ...

最新文章

  1. 并发的HashMap为什么会引起死循环?(转)
  2. QEMU-KVM中的多线程压缩迁移技术
  3. PHP Smarty变量调节器
  4. int arr 13 java,java学习13 - 数组的定义、操作、异常、二维数组
  5. 计算机缺失esul.dll,SceneUI.ES.dll
  6. 【C++11新特性】 C++11智能指针之unique_ptr
  7. delphi 获取桌面路径
  8. mysql 8.0 postgresql_PostgreSQL8.0的安装和配置- -
  9. python 图书馆管理程序下载_图书管理系统 免费开源代码 开发,分享 - CodeForge.cn...
  10. 漂亮实用的loading(加载)封装
  11. 个人财务管理系统mysql_个人财务管理系统功能模块设计
  12. Excel教程:7个极具技巧的公式嵌套,收藏用一辈子
  13. Android Studio插件整理
  14. 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
  15. “刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!
  16. IMAX6ULL正点原子学习笔记(led汇编驱动)
  17. Easy Excel
  18. android获取root权限的命令
  19. Python 队列之传土豆(《Python数据结构与算法分析》第二版)
  20. 力士乐比例阀4WRZE25W6-325-7X/6EG24N9ETK31/F1V

热门文章

  1. Python 基础课程第八天
  2. verilog之编程应该注意的事项
  3. export ,export default 和 import 区别以及用法
  4. python 在window 系统 连接并操作远程 oracle 数据库
  5. 在LINUX上部署SOFA
  6. opentsdb+grafana监控系按使用总结
  7. Mac OS X Yosemite安装Hadoop 2.6记录
  8. IK Analyzer 中文分词器
  9. golang http client 使用gzip_Grpc介绍 — Go-Service To PHP-Client
  10. linux 内存 实例,linux内存地址分配(示例代码)