C语言-字符函数和字符串函数(库函数)的模拟实现

strlen 的使用和模拟实现

strlen 函数用于计算C字符串(以空字符 '\0' 结尾的字符数组)的长度,不包括结尾的空字符。

使用:

#include <string.h>
char str[] = "Hello";
size_t len = strlen(str);  // len 将会是 5

模拟实现:

size_t my_strlen(const char *str) {
    const char *s;
    for (s = str; *s; ++s) {}
    return (s - str);
}

strcpy 的使用和模拟实现

strcpy 函数用于复制一个字符串到另一个字符串,包括结束的空字符。

使用:

#include <string.h>
char src[] = "Hello";
char dest[6];
strcpy(dest, src);

模拟实现:

char *my_strcpy(char *dest, const char *src) {
    char *ret = dest;
    while (*src) {
        *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}

strcat 的使用和模拟实现

strcat 函数用于将一个字符串追加到另一个字符串的末尾。

使用:

#include <string.h>
char dest[20] = "Hello";
char src[] = " World";
strcat(dest, src);  // dest 现在是 "Hello World"

模拟实现:

char *my_strcat(char *dest, const char *src) {
    char *ret = dest;
    while (*dest) {
        dest++;
    }
    while (*src) {
        *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}

strcmp 的使用和模拟实现

strcmp 函数用于比较两个字符串。如果第一个字符串在字典序上小于第二个,则返回负值;如果两个字符串相等,则返回0;如果第一个字符串大于第二个,则返回正值。

#include <string.h>
int result = strcmp("Hello", "World");  // result 将小于 0

模拟实现:

int my_strcmp(const char *s1, const char *s2) {
    while (*s1 && (*s1 == *s2)) {
        s1++;
        s2++;
    }
    return *(const unsigned char *)s1 - *(const unsigned char *)s2;
}

在模拟实现中,每个函数都简单地遍历了字符串直到遇到结束的空字符。在 strcpystrcat 中,目标字符串被逐字符更新,而 strcmp 则逐字符比较直到找到一个不匹配的字符或到达字符串末尾。

strstr 的使用和模拟实现

strstr 函数用于在一个字符串中查找子字符串的第一次出现。如果找到子字符串,它返回子字符串第一次出现的地址;如果没有找到,则返回 NULL

使用:

#include <string.h>
char str[] = "Hello, world!";
char substr[] = "world";
char *result = strstr(str, substr);  // result 将指向 "world!"

模拟实现:

char *my_strstr(const char *haystack, const char *needle) {
    if (!*needle) {
        return (char *)haystack;
    }

    for (; *haystack; haystack++) {
        if (*haystack == *needle) {
            const char *h = haystack;
            const char *n = needle;

            while (*h && *n && *h == *n) {
                h++;
                n++;
            }

            if (!*n) {
                return (char *)haystack;
            }
        }
    }

    return NULL;
}

在这个实现中:

  • 我们首先检查 needle 是否为空字符串。如果是,根据 strstr 函数的定义,返回 haystack 的起始位置。
  • 对于 haystack 中的每个字符,我们检查它是否与 needle 的第一个字符相匹配。
  • 如果找到匹配,我们在两个字符串上同时迭代,直到不再匹配或达到 needle 的末尾。
  • 如果成功匹配了整个 needle,返回当前 haystack 的位置。
  • 如果在整个 haystack 中都没有找到匹配,返回 NULL

这种实现是直接和简单的,但可能不是最高效的,特别是对于较长的字符串或在字符串中频繁出现部分匹配的情况。在实践中,更高效的算法(如KMP算法)可能会被用于字符串匹配。

字符分类函数

C语言中的字符分类函数位于 <ctype.h> 头文件中,用于测试字符属于哪个类别(如字母、数字等)。一些常用的字符分类函数包括:

  • isalpha(c): 检查 c 是否为字母。
  • isdigit(c): 检查 c 是否为数字。
  • isalnum(c): 检查 c 是否为字母或数字。
  • isspace(c): 检查 c 是否为空格字符。
  • isupper(c): 检查 c 是否为大写字母。
  • islower(c): 检查 c 是否为小写字母。

字符转换函数

字符转换函数也在 <ctype.h> 中定义,用于转换字符的大小写:

  • toupper(c): 将字符 c 转换为大写(如果是小写字母)。
  • tolower(c): 将字符 c 转换为小写(如果是大写字母)。

strncpy 函数的使用

strncpy 用于将一个字符串复制到另一个字符串,最多复制 n 个字符。如果源字符串长度小于 n,目标字符串的剩余部分将用空字符填充。

使用:

#include <string.h>
char src[] = "Hello";
char dest[10];
strncpy(dest, src, 10);  // dest 将是 "Hello",后面跟着空字符

strncat 函数的使用

strncat 用于将一个字符串追加到另一个字符串的末尾,最多追加 n 个字符,并在最后添加一个空字符。

使用:

#include <string.h>
char dest[20] = "Hello";
char src[] = " World";
strncat(dest, src, 6);  // dest 现在是 "Hello World"

strncmp 函数的使用

strncmp 用于比较两个字符串的前 n 个字符。它的工作方式与 strcmp 类似,但只比较前 n 个字符。

使用:

#include <string.h>
int result = strncmp("Hello", "Hello, world!", 5);  // result 将是 0

strtok 函数的使用

strtok 用于将字符串分割成一系列的标记(tokens)。第一次调用时,strtok 接收要分割的字符串,之后的调用接收 NULL,以继续从上次停止的地方开始分割。

#include <string.h>
char str[] = "Hello, world!";
const char delimiters[] = " ,!";
char *token = strtok(str, delimiters);
while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, delimiters);
}

strerror 函数的使用

strerror 用于返回一个描述错误代码含义的字符串。它通常用于处理与标准错误相关的信息。

使用:

#include <string.h>
#include <errno.h>
errno = ENOENT;  // 设置错误码
printf("%s\n", strerror(errno));  // 打印错误信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值