字符串函数的介绍与模拟实现(一)

简介:

strlen的使用与模拟实现

#include<string.h>
size_t strlen ( const char * str );

strlen函数是求字符串长度的函数,其使用需要包含头文件,其返回值是**‘/0’**前所有的字符数量,函数的返回值为无符号(size_t)类型整数


模拟实现

方法一

*计数器方式


int my_strlen(const char * str)
{
 int count = 0;
 assert(str);
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}


assert断言其不为空指针,指针向右移动,直到遇见**‘/0’**为止。

方法二

*指针-指针方式


int my_strlen(char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
}

strcpy函数的模拟与实现

char* strcpy(char * dest, const char * src );

strcpy函数是C语言中的一个字符串处理函数,用于将一个字符串复制到另一个字符串中,dest是目标字符串,src是源字符串。strcpy函数将源字符串src复制到目标字符串dest中,并返回目标字符串的指针。需要注意的是,目标字符串dest必须有足够的空间来存储源字符串src的内容,否则可能会出现缓冲区溢出的问题


示例代码如下


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

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    strcpy(dest, src);
    printf("%s", dest);

    return 0;
}


需要注意,strcpy函数会将源字符串中的 ‘\0’ 拷贝到目标空间。

模拟实现


int my_strcpy(char*dest,char*src)
{
    char* ret = dest;
    assert(dest && src);
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}


这里ret记录目标字符串起始地址,在修改后进行返回,while中两个变量先赋值再加加。


strcat函数的使用与模拟实现

strcat函数,是C语言中的一个字符串处理函数,用于将一个字符串追加到另一个字符串的末尾。其声明如下:


char *strcat(char *dest, const char *src);


其中,dest是目标字符串,src是要追加到目标字符串末尾的源字符串。strcat函数将源字符串src追加到目标字符串dest的末尾,并返回目标字符串的指针。需要注意的是,目标字符串dest必须有足够的空间来容纳源字符串src的内容,否则可能会出现缓冲区溢出的问题。

示例代码如下:


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

int main() {
    char dest[20] = "Hello, ";
    char src[] = "world!";

    strcat(dest, src);
    printf("%s\n", dest);

    return 0;
}


在这里我们思考一下,能否实现一下代码?


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

int main() {
    char dest[20] = "Hello";
    strcat(dest, dest);
    printf("%s\n", dest);

    return 0;
}


当这个例子中使用 strcat(dest, dest); 时,意味着将 dest 中的内容追加到 dest 本身的末尾。这是一个问题,因为 strcat 函数期望第一个参数指向一个以 '\0' 结尾的字符串,而且第二个参数也必须指向一个以 '\0' 结尾的字符串。


在这个例子中,dest 只包含一个字符串 “Hello” ,因此没有 '\0' 空字符来标记字符串的结束。在C语言中,字符串必须以 '\0' 结尾,这是C语言的约定。因此,由于缺少 '\0' 结尾符, strcat 函数无法判断字符串的结束位置,这可能导致未定义的行为。


另外,如果 dest 的长度不够长,strcat 函数仍然可能会导致缓冲区溢出,这也是应该避免的情况。


因此,应该遵循C语言的约定,确保字符串以 '\0' 结尾,并且避免使用 strcat 将一个字符串追加到自身。

模拟实现


char* my_strcat(char* dest, const char* src)
{
  char* ret = dest;
  assert(dest && src);
  while (*dest)
  {
    dest++;//找到\0
  }
  while ((*dest++ = *src++))
  {
    ;
  }
  return ret;
}


strcmp函数的使用与模拟实现

strcmp函数是C语言中的一个字符串处理函数,用于比较两个字符串的大小。该函数的声明如下:


int strcmp(const char *str1, const char *str2);

其中,str1和str2是要进行比较的两个字符串。strcmp函数会按照字典顺序逐个比较两个字符串中对应位置的字符,直到遇到不同的字符或者其中一个字符串结束为止。比较规则是按照ASCII码表的顺序进行比较。


函数返回值为:


*如果字符串str1小于str2,则返回一个负数。

*如果字符串str1大于str2,则返回一个正数。

*如果字符串str1等于str2,则返回0。


示例代码如下:




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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

模拟实现

int my_strcmp (const char * str1, const char * str2)
{
 int ret = 0 ;
 assert(str1&&str2);
 while(*str1 == *str2)
 {
 if(*str1 == '\0')
 return 0;
 str1++;
 str2++;
 }
 return *str1-*str2;
}


strstr函数的使用与模拟实现

strstr 函数是 C 语言中的一个字符串处理函数,用于在一个字符串中查找另一个字符串第一次出现的位置。其声明如下:

char *strstr(const char *haystack, const char *needle);



其中,haystack 是要在其中查找的字符串,而 needle 则是要查找的子字符串。strstr 函数将会在 haystack 中找到第一次出现 needle 的位置,如果找到则返回该位置的指针,如果找不到则返回一个空指针。


示例代码如下:


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

int main() {
    const char *haystack = "Hello, world! This is a test.";
    const char *needle = "world";

    char *result = strstr(haystack, needle);

    if (result) {
        printf("'%s' found at position %ld\n", needle, result - haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle, haystack);
    }

    return 0;
}


在上述示例中,strstr 函数被使用来查找子字符串 “world” 在字符串 “Hello, world! This is a test.” 中的位置。如果找到子字符串,则会输出子字符串的位置,如果找不到,则会输出未找到的信息。

模拟实现

char* my_strstr(const char* str1, const char* str2) {
    if (*str2 == '\0') {
        return (char*)str1; 
    }

    while (*str1 != '\0') {
        const char* h = str1;
        const char* n = str2;
        while (*n != '\0' && *h == *n) {
            h++;
            n++;
        }
        if (*n == '\0') {
            return (char*)str1;
        }
        str1++;
    }

    return NULL; 
}

感谢阅读




相关文章
|
传感器 监控 网络协议
使用ESP32 + HaaS Python打造运动心率检测系统 云上实时守护运动健康
使用ESP32 + HaaS Python打造运动心率检测系统 云上实时守护运动健康
695 1
|
数据采集 测试技术 数据处理
LabVIEW高温摩擦磨损测试系统
LabVIEW高温摩擦磨损测试系统
189 0
|
Java 关系型数据库 数据库
Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)
Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)   转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614.
3217 0
|
3天前
|
云安全 人工智能 运维
阿里云SecOps Agent,全新安全跨产品执行体验
自然语言驱动 云安全中心/WAF/CFW/ 等多款安全产品联动
1591 2
|
3天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
549 3
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
13天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
14天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
896 11
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
2天前
|
人工智能 监控 前端开发
Electron 监控:让桌面 Agent 监控触手可及
一行代码实现Electron桌面端全景监控,自动还原崩溃现场、预警内存泄漏、全链路追踪、 SSE流式响应与交互埋点,让 AI 助手运行状态清晰可见,助力快速恢复稳定与流畅。
177 126