当前位置: 首页 > news >正文

C语言字符串函数介绍以及模拟实现

在C语言的编程世界里,对文本的精确处理是构建复杂程序的基础。字符与字符串操作看似简单,却蕴含着诸多细节与潜在陷阱。本文将系统解析C标准库中核心的字符分类、转换及字符串操作函数,不仅讲解其标准用法,更通过关键函数的模拟实现,揭示底层逻辑,帮助你从“会用”到“懂原理”,从而写出更健壮、高效的代码。

目录

1.字符分类函数

2.字符转换函数

3.strlen函数使用和模拟实现

4.strcpy函数使用和模拟实现

5.strcat函数使用和模拟实现

6.strcmp函数使用和模拟实现

7.strstr函数使用和模拟实现

8.strncpy函数使用和模拟实现

9.strncat函数使用和模拟实现

10.strncmp函数使用和模拟实现


1.字符分类函数

C语言中有一系列的函数专门做字符分类的,也就是一个字符属于什么类型的字符。

这些函数的使用需要包含ctype.h头文件

例如islower是判断参数部分是否是小写字母。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是则返回0。下题将小写字母转换为大写

#include <stdio.h> #include <ctype.h> int main () { int i = 0; char str[] = "Test String.\n"; char c; while (str[i]) { c = str[i]; if (islower(c)) c -= 32; putchar(c); i++; } return 0; }

2.字符转换函数

C语言提供了2个字符转换函数:

toupper ----- 小写转大写

tolower ----- 大写转小写

上面的代码我们使用-32完成小写转大小,有了转换函数,我们就可以直接使用tolower函数完成转换。

#include <stdio.h> #include <ctype.h> int main() { int i = 0; char str[] = "Test String.\n"; char c; while (str[i]) { c = str[i]; if (islower(c)) c = toupper(c); putchar(c); i++; } return 0; }

3.strlen函数使用和模拟实现

作用:计算字符串的长度。注意:字符串的长度不包括字符'\0'。

返回值:是int型

#include <stdio.h> #include <string.h> int main() { const char* str1 = "abcdef"; const char* str2 = "hijkl"; if (strlen(str2) - strlen(str1) > 0) { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }

模拟实现:

//法一 int my_strlen(char* s) { assert(s); char* p = s; while (*p) { p++; } return p - s; } //法二 int my_strlen1(char* p) { int count = 0; while (*p) { count++; p++; } return count; } int main() { char s1[] = "jakdhfbasdha"; int ret = my_strlen(s1); int ret1 = my_strlen1(s1); printf("%d\n", ret); printf("%d\n", ret); return 0; }

4.strcpy函数使用和模拟实现

作用:将源节点指向的C字符串复制到目的地指向的数组中,包括终止的空字符(并在该点停止)。

  • 源字符串必须以 '\0'结束。
  • 会将源字符串中的 '\0'拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。
int main() { char* str1 = "abcdef"; char* str2; // 把str1的内容拷贝到str2,参数为字符数组指针 strcpy(str2, str1); printf("str2 = %s\n", str2); // str2 = abcdef return 0; }

模拟实现

char * my_strcpy(char* p, char* q) { assert(p); assert(q); while (*p = *q) { p++; q++; } return p; } int main() { char str1[10]; char str2[] = "abcdef"; my_strcpy(str1, str2); printf("%s", str1); return 0; }a

5.strcat函数使用和模拟实现

作用:将字符串str2添加到字符串str1的尾部,即拼接两个字符串。

  • 源字符串必须以'\0'结束。
  • 目标字符串中也得有 \0,否则没办法知道追加从哪⾥开始。
  • 目标空间必须有足够的⼤,能容纳下源字符串的内容。
  • 目标空间必须可修改。
int main() { char str1[] = "abcde "; char str2[] = "fghij"; strcat(str1, str2); printf("%s\n", str1); //abcde fghij return 0; }

模拟实现

char* my_strcat(char* p, const char* q) { while (*p) { p++; } while (*q) { *p = *q; p++; q++; } *p = '\0'; return p; } int main() { char str1[20] = "abcdef"; char* str2 = "hijklmn"; my_strcat(str1, str2); printf("%s", str1); return 0; }

6.strcmp函数使用和模拟实现

作用:比较两个字符串长度

  • 第⼀个字符串大于第⼆个字符串,则返回大于0的数字
  • 第⼀个字符串等于第⼆个字符串,则返回0
  • 第⼀个字符串小于第⼆个字符串,则返回小于0的数字
int main() { char str1[] = "abcdef"; char str2[] = "abcdef"; char str3[] = "abd"; int ret1 = strcmp(str1, str2); //ret1=0 int ret2 = strcmp(str1, str3); //ret2=1 return 0; }

模拟实现

int my_strcmp(const char* str1, const char* str2) { while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } return *str1 - *str2; } int main() { char* str1 = "abcde"; char* str2 = "abcdf"; int ret = my_strcmp(str1, str2); if (ret > 0) { printf("str1>str2\0"); } else if (ret == 0) { printf("str1=str2\n"); } else printf("str1<str2\n"); return 0; }

7.strstr函数使用和模拟实现

作用:函数返回字符串str2在字符串str1中第⼀次出现的位置

int main() { char str[] = "This is a simple string"; char* pch; pch = strstr(str, "simple"); printf("%s\n", pch); strncpy(pch, "sample", 6); printf("%s\n", str); return 0; }

模拟实现

char* my_strstr(const char* p, const char* q) { assert(p); assert(q); char* ret = (char*)p; char* p_cur = NULL; char* q_cur = NULL; while (*ret) { p_cur = ret; q_cur = (char*)q; while (*p_cur != '\0' && *q_cur != '\0' && *p_cur == *q_cur) { p_cur++; q_cur++; } if (*q_cur == '\0') { return ret; } ret++; } return NULL; } int main() { char str1[] = "Returns a pointer to the first occurrence of str2 in str1"; char* str2 = "first"; char* str3; str3=my_strstr(str1, str2); printf("%s", str3); return 0; }

8.strncpy函数使用和模拟实现

作用:拷贝num个字符从源字符串到目标空间。

如果源字符串的长度小于num,则考贝完源字符串之后,在目标的后边追加0,直到num个。

int main() { char str1[] = "abc def"; char str2[] = "jkl"; strncpy(str1, str2, strlen(str2)); printf("%s\n", str1); //jkl def return 0; }

模拟实现

char* my_strncpy(char* destination, const char* source, size_t num) { int i = 0; assert(source); assert(destination); char* p = destination; while (i < (int)num && *source) { *destination = *source; destination++; source++; i++; } *destination = '\0'; return p; } int main() { char str1[100]; //char* str2 = "abcdef hijkl mnopq"; char* str2 = "abcd"; my_strncpy(str1, str2, 12); printf("%s", str1); return 0; }

9.strncat函数使用和模拟实现

作用:将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0字符。

如果source 指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加到destination指向的字符串末尾

int main() { char str1[20]; char str2[20]; strcpy(str1, "To be "); strcpy(str2, "or not to be"); strncat(str1, str2, 6); printf("%s\n", str1); //To be or not return 0; }

模拟实现

char* my_strncat(char* p, const char* q, int num) { assert(p); assert(q); char* pcur = p; while (*pcur) { pcur++; } int i = 0; while (i < num && *q) { *pcur++ = *q++; i++; } *pcur = '\0'; return p; } int main() { char str1[20] = "abcde "; char* str2 = "fgh ii jkl mn"; my_strncat(str1, str2, 6); printf("%s", str1); return 0; }

10.strncmp函数使用和模拟实现

作用:比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字⺟,如果提前发现不⼀样,就提前结束,大的字符所在的字符串大于另外⼀个。如果num个字符都相等,就是相等返回0.

int main() { char str1[] = "abcdef"; char str2[] = "abcdef"; char str3[] = "abd"; int ret1 = strncmp(str1, str2,3); //ret1=0 int ret2 = strncmp(str1, str3,3); //ret2=<0 return 0; }

模拟实现

int my_strncmp(const char* str1, const char* str2, size_t num) { assert(str1 && str2); while (num > 0 && *str1 != '\0' && *str2 != '\0' && *str1 == *str2) { str1++; str2++; num--; } if (num == 0) { return 0; // 前num个字符全相等 } return *str1 - *str2; } int main() { char* s1 = "abcdef"; char* s2 = "abcxyz"; printf("%d\n", my_strncmp(s1, s2, 3)); //=0 printf("%d\n", my_strncmp(s1, s2, 4)); //<0 return 0; }
http://www.jsqmd.com/news/124474/

相关文章:

  • Windows平台Arduino IDE驱动安装避坑指南
  • 【2024最新】xhs数据采集工具的完整使用指南
  • Cowabunga Lite终极指南:iOS个性化定制完全手册
  • HarmonyOS 4G AT指令测试器
  • FGO-Automata:从手指酸痛到游戏自由的智能蜕变
  • 实验室改造?这几个方案超赞!
  • TranslucentTB 终极指南:打造透明任务栏的完整解决方案
  • XHS-Downloader:小红书内容下载的完整指南与高效解决方案
  • MAA自动公招系统:智能招募的终极指南与高效配置方法
  • 终极C盘清理方案:Windows系统一键释放磁盘空间
  • WindowsCleaner:告别C盘爆红的终极清理方案
  • ComfyUI-Manager终极指南:一站式插件管理解决方案
  • 怎样快速掌握BGE大模型:面向新手的5个秘诀
  • ComfyUI Manager终极指南:5步快速搭建AI绘画插件生态
  • 小红书数据采集框架完全手册
  • 2025年值得关注的GEO服务商TOP榜单:优势特点与适用场景分析 - 深度智识库
  • 全网围观的2025大语言模型回顾:AI大牛karpathy总结了六大关键节点
  • WindowsCleaner:让C盘重获新生的智能清理神器
  • 告别手动刷本:三月七小助手让你的星穹铁道游戏体验全面升级
  • C语言内存函数介绍和模拟实现
  • 词库迁移革命:智能转换工具让输入法切换零烦恼
  • 2025常州GEO优化公司精选:AI驱动下的精准获客服务商指南 - 品牌推荐排行榜
  • Windows Cleaner终极指南:简单三步告别C盘爆满困扰
  • 小红书内容采集与下载的完整指南:XHS-Downloader使用全解析
  • Multisim无法访问数据库:.NET Framework依赖配置
  • 一文说清二极管如何提升工业电源效率
  • 小红书内容高效下载指南:XHS-Downloader完全使用教程
  • AIGC率73%→2%!亲测1小时稳过,这套“三层过滤法”降ai率绝了!【附降ai提示词】
  • MTKClient完整教程:如何轻松掌握联发科设备调试技巧
  • ComfyUI-Manager版本迁移终极指南:从备份到优化的完整流程