strerror函数的详细解析

一、strerror函数源码

strerror函数是C标准库中用来将errno值转为可读错误信息的函数。errno是系统和函数调用时产生的错误标识。strerror源码如下:

char *strerror(int errnum)
{
    static char buf[BUF_SIZE]; //BUF_SIZE表示最大可用的错误字符串长度
    if (errnum = _sys_nerr || _sys_errlist[errnum] == NULL) {
        snprintf(buf, BUF_SIZE, "Unknown error %d", errnum); //若错误码不在区间[0,_sys_nerr)中,则返回"Unknown error [错误码]"
    } else {
        snprintf(buf, BUF_SIZE, "%s", _sys_errlist[errnum]); //否则返回对应错误码的字符串
    }
    return buf;
}

该函数通过在全局变量_sys_errlist中查找对应错误码的字符串,并将其拷贝到静态的缓冲区buf中,返回buf的地址。如果不在可处理范围内,则返回默认字符串“Unknown error [错误码]”。

二、返回当前errno值

errno是一个宏,可用于在C程序中查询函数调用的错误。errno在头文件中定义。errno值反映上一次系统调用执行时发生的错误状态。示例代码如下:

#include 
#include 
#include 

int main() {
    FILE *fp;
    fp = fopen("non-existent-file.txt", "r"); // 将尝试打开一个不存在的文件
    if (fp == NULL) {
        printf("打开文件失败,错误码:%d,错误信息:%s\n", errno, strerror(errno));
    } else {
        // 处理读取文件的代码
    }
    return 0;
}

上述代码中,文件指针fp的值将为NULL,因为尝试打开的文件不存在。此时,errno为2,对应常量为ENOENT,即No such file or directory。使用strerror函数将错误码转为错误信息字符串并输出。

三、strerror函数头文件

在使用strerror函数之前需要进行头文件包含。strerror函数声明在中,应当在源文件顶部加上以下语句:

#include 

四、strerror函数和perror

perror函数用于在标准错误流stderr上输出错误信息,它将参数中的字符串和errno对应的错误信息一起输出。perror函数的源码如下:

void perror(const char *s)
{
    fprintf(stderr, "%s: %s\n", (s == NULL) ? "" : s, strerror(errno));
}

其中s是一个字符串,若非空,它将在错误信息前输出。此外,strerror(errno)返回的是静态内存空间的指针。perror函数直接输出这个指针的内容到标准错误流中,所以可以直接使用perror输出错误信息,代码如下所示:

#include 
#include 

int main() {
    FILE *fp;
    fp = fopen("non-existent-file.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
    } else {
        // 处理读取文件的代码
    }
    return 0;
}

五、strreverse函数

strreverse函数会将字符串原址翻转。源码如下:

char *strreverse(char *str) {
    if (str == NULL) return NULL;
    unsigned int len = strlen(str);
    char temp;
    for (int i=0; i<len/2; i++) {
        temp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = temp;
    }
    return str;
}

该函数先判断了参数是否为NULL,可以避免出现引用空指针的情况。然后获取了字符串长度len,使用交换的方式将前一半和后一半字符严格对称的位置进行交换。最后返回原址。

六、strrchr函数

strrchr函数用于在一个字符串中查找一个给定的字符,返回该字符在字符串中最后一次出现的位置。如果未找到,函数返回NULL。源码和示例代码如下:

char *strrchr(const char *s, int c) {
    const char *last = NULL;
    do {
        if (*s == (char)c) {
            last = s;
        }
    } while (*s++ != '\0');
    return (char *)last;
}

#include 
#include 

int main() {
    char str[] = "Hello, world!";
    char *p = strrchr(str, 'o');
    if (p != NULL) {
        printf("最后一个o在%s的第%d个位置\n", str, p-str+1);
    } else {
        printf("未找到o字符\n");
    }
    return 0;
}

上述代码中,char *p = strrchr(str, ‘o’)将返回最后一个字符o的位置,用指针p指向该位置,然后p-str+1得到字符在字符串中的位置。若未找到字符o,则返回NULL。

七、strrev函数

strrev函数用来翻转一个字符串。源码如下:

char *strrev(char *str) {
    if (str == NULL) return NULL;
    char *p1, *p2;
    p1 = str;
    p2 = str + strlen(str) - 1;
    while (p1 < p2) {
        char temp;
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        p1++;
        p2--;
    }
    return str;
}

该函数使用双指针迭代的方式将字符串头和尾位置的字符依次进行交换。返回字符串原址。

八、strtrim函数

strtrim函数用于从字符串的首尾删除空格字符(包括\t、\n、\v、\f、\r、空格)。

char *strtrim(char *str) {
    if (str == NULL) return NULL;
    int len = strlen(str);
    char *p1, *p2;
    p1 = str;
    while (*p1 != '\0' && isspace(*p1)) {
        p1++;
    }
    p2 = str + len - 1;
    while (p2 > p1 && isspace(*p2)) {
        p2--;
    }
    *(p2+1) = '\0';
    return p1;
}

该函数首先判断字符串是否为NULL,然后使用指针p1找到字符串首部出现的第一个非空格字符位置。然后使用指针p2找到字符串尾部出现的第一个非空格字符位置的前一个位置,因为该字符直到该位置都应该保留,而不是实际删除。删除尾部空格的方法是将尾指针递减直到p1之前,加上’\0’表示字符串的结束。最后返回字符串指向p1的指针。

结尾

本文详细介绍了strerror函数及其相关函数的含义、源码和使用。strerror函数可以将errno值转换为可读的错误信息字符串;errno表示了函数调用时返回的错误码。strreverse、strrchr、strrev、strtrim函数分别用于字符串翻转、查找最后一个字符位置、翻转字符串、删除首尾空格。熟练掌握这些函数可以使程序开发更加便捷和高效。

原创文章,作者:TCPCR,如若转载,请注明出处:https://www.506064.com/n/313273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TCPCRTCPCR
上一篇 2025-01-07 09:43
下一篇 2025-01-07 09:43

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29

发表回复

登录后才能评论