strerror函数的详细解析(C标准库详解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,错误信息:%sn", 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: %sn", (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++ != '');
    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 != '' && isspace(*p1)) {
        p1++;
    }
    p2 = str + len - 1;
    while (p2 > p1 && isspace(*p2)) {
        p2--;
    }
    *(p2+1) = '';
    return p1;
}

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

结尾

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平