C 标准库 errno.h

yizhihongxing

让我们来详细讲解一下 C 标准库 errno.h 的使用攻略。

什么是 errno?

errno 是 C 标准库中的一个全局变量,其类型为 int,用于表达函数或操作的错误码(错误编号)。如果一个函数或操作执行出错,其返回值可能无法明显地反映错误的信息,此时可以通过 errno 变量获取更详细的错误信息。errno 的具体取值由库函数或系统调用设置。

系统调用是 Linux 操作系统中的一种机制,用户进程可以通过系统调用向操作系统内核(kernel)请求某些任务,如:文件操作、网络操作等。如果系统调用失败,则它们通常会将 errno 设置为一个非零值来指示失败类型。

errno.h 头文件

errno 变量及与其相关的宏定义都定义在 C 标准库头文件 errno.h 中。因此,在使用 errno 时需要包含该头文件。

#include <errno.h>

errno 的使用

使用 errno 变量获取错误码的基本步骤如下:

  1. 在使用可能出错的函数后判断其返回值是否有错误(通常为 -1,但也有例外),如果有,说明可能存在错误。
  2. 在需要获取错误码的位置检查 errno 变量的值,如果 errno 值为非零值,说明出现了错误。可以通过 perror()strerror() 函数将错误输出到标准错误输出(stderr)中,并清除 errno 的值,以便后续的调用不受影响。
  3. 根据需要进行错误处理。

下面分别介绍如何使用 perror()strerror() 函数进行错误处理。

perror()

perror() 函数可以将 errno 对应的错误信息输出到标准错误输出(stderr)中,同时可以自定义前缀信息。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void) {
    FILE *fp = fopen("notexist.txt", "r");
    if (fp == NULL) {
        perror("fopen() error");
    }
    return 0;
}

输出结果:

fopen() error: No such file or directory

strerror()

strerror() 函数可以将一个错误码转化为对应的错误信息。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(void) {
    FILE *fp = fopen("notexist.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
    }
    return 0;
}

输出结果:

Error: No such file or directory

示例说明

示例一:文件读取错误

在为文件打开或创建时,发生错误时都会涉及 errno 变量。下面以文件读取为例进行说明。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int get_file_size(const char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
        return -1;
    }

    fseek(fp, 0L, SEEK_END);
    int size = ftell(fp);
    fclose(fp);
    return size;
}

int main(void) {
    int size = get_file_size("notexist.txt");
    if (size == -1) {
        return 1;
    }
    printf("The size of file is: %d\n", size);
    return 0;
}

输出结果:

Error: No such file or directory

示例二:内存分配错误

在进行内存动态分配时,如果分配失败,会涉及 errno 变量。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define MAX_SIZE (1024 * 1024 * 1024)

int main(void) {
    int *ptr = malloc(MAX_SIZE);
    if (ptr == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
        return 1;
    }
    free(ptr);
    return 0;
}

输出结果:

Error: Cannot allocate memory

以上就是 errno.h 的使用攻略,希望能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 标准库 errno.h - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言动态链表实现学生学籍管理系统

    首先,C语言动态链表实现学生学籍管理系统需要完成以下几个步骤: 定义学生信息结构体:包括学生学号、姓名、性别、年龄等信息; 动态创建链表:动态分配内存空间,创建链表头指针,并将链表头指针设为 NULL; 添加学生信息:包括从键盘输入学生信息、创建新节点、将新节点添加到链表末尾等步骤; 查找学生信息:包括按学号查找、按姓名查找等功能; 修改学生信息:包括按学号…

    C 2023年5月23日
    00
  • 将Emacs打造成强大的Python代码编辑工具

    当你选择使用 Emacs 作为 Python 的编辑器时,你会拥有一个非常强大的工具,Emacs 配合一些插件和定制的设置,可以满足你对 Python 编辑器的所有需求。 下面是将 Emacs 打造成强大的 Python 代码编辑工具的攻略: 安装 Python 模式 首先,你需要安装一个称为“Python 模式”的软件包。该软件包提供了一些有用的功能,如代…

    C 2023年5月23日
    00
  • C++随机点名生成器实例代码(老师们的福音!)

    首先,我们需要明确实现这个随机点名生成器的基本思路。我们需要一个名单,这个名单中包含每个学生的姓名信息,然后从这个名单中随机选择一个学生进行点名。因此,我们需要把这个名单存储在程序中,并且要有一个随机数函数来随机选择学生。 接下来,我们需要定义一个学生类,用来存储学生的姓名信息。在这个类中,我们需要定义公有的姓名属性,并且需要定义构造函数和析构函数。 在主函…

    C 2023年5月30日
    00
  • ubuntu20.04中vscode使用ROS的详细方法

    下面是“Ubuntu 20.04中VSCode使用ROS的详细方法”的攻略,包含以下几个步骤: 1. 安装ROS 首先需要安装ROS,可以按照官方文档的步骤进行安装。以ROS Noetic为例,可以在终端中输入以下命令: sudo apt install ros-noetic-desktop-full 安装完成后,需要初始化ROS环境变量。可以在终端中输入以…

    C 2023年5月23日
    00
  • C语言中的多态

    多态是面向对象编程中的一个重要概念,但是在C语言中并不是一种原生特性。然而,通过使用函数指针和结构体等技术,我们可以实现在C语言中实现多态。下面是一份详细的使用攻略: 什么是多态 多态是一种可以让不同对象具有不同行为的编程技术,它允许我们使用统一的接口处理不同类型的数据。在面向对象编程中,多态通常是通过继承和方法重写来实现的。在 C 语言中,则主要通过函数指…

    C 2023年5月10日
    00
  • Vue element ui用户展示页面的实例

    下面我将为你详细讲解“Vue element ui用户展示页面的实例”的完整攻略。 1. 环境配置 在开始使用Vue element ui之前,需要先进行环境配置。具体操作步骤如下: 安装Node.js:在Node.js官网下载对应系统的安装包,安装完成后,在命令行中输入node -v查看是否安装成功; 安装Vue CLI:在命令行中输入npm instal…

    C 2023年5月23日
    00
  • 详解Java异常处理的使用与思考

    详解Java异常处理的使用与思考 在Java程序开发过程中,异常处理是必不可少的一部分。Java提供了完整的异常处理机制,可以有效地处理程序中的异常情况,使程序更加健壮和稳定。本文将详细介绍Java异常处理的使用和思考,帮助读者更好地掌握这一重要的技术。 什么是异常? 异常是指程序在运行过程中遇到的一些错误或异常情况,如除数为0、数组下标越界等情况。在Jav…

    C 2023年5月23日
    00
  • C++ 学习之旅二 说一说C++头文件

    C++ 学习之旅二 说一说C++头文件 在C++编程中,我们有时需要引入头文件来使用其中的函数和变量等内容。那么什么是头文件?如何使用头文件呢?本文将从以下两个方面来详细讲解C++头文件的使用: 头文件的作用 如何使用头文件 头文件的作用 头文件(Header File)是一种特殊的文件,一般用来存放程序中的函数声明、define值和类声明等等。头文件的作用…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部