一、strerror函数源码
strerror函数是C标准库中用来将errno值转为可读错误信息的函数。errno是系统和函数调用时产生的错误标识。strerror源码如下:
char *strerror(int errnum)
{
static char buf[BUF_SIZE]; //BUF_SIZE表示最大可用的错误字符串长度
if (errnum < 0 || 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.h>
头文件中定义。errno
值反映上一次系统调用执行时发生的错误状态。示例代码如下:
#include <stdio.h>
#include <errno.h>
#include <string.h>
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
函数声明在<string.h>
中,应当在源文件顶部加上以下语句:
#include <string.h>
四、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 <stdio.h>
#include <errno.h>
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 <stdio.h>
#include <string.h>
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
函数分别用于字符串翻转、查找最后一个字符位置、翻转字符串、删除首尾空格。熟练掌握这些函数可以使程序开发更加便捷和高效。