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

【C语言进阶】字符函数和字符串函数的内部原理

前言

        c语言没有字符串类型,字符串通常放在常量字符串或者字符数组里面,本节内容是介绍关于字符串的函数,并且详细剖析了内部的原理。

 1.strlen函数

size_t strlen(const char* str);

        原理是字符指针遇到'\0'就停止,最终计算'\0'之前的长度。所以这里放一个字符数组那么得出的值就是随机值。

        strlen的返回值是size_t,其实就是无符号整型,在使用这个函数的时候需要注意一些小的细节。

易错:由于strlen返回的是无符号整型,所以永远不会输出负数,这里的-3被当做无符号整型的时候,在内存中是一个非常大的数字,这里的结果就会影响逻辑判断。

1.1 模拟实现

#include<stdio.h>
#include<assert.h>
// 1.模拟实现strlen
size_t mystrlen(const char* str) 
{assert(str); // 断言,避免是空指针size_t len = 0;while (*str != '\0'){str++;len++;}return len;
}int main()
{char str[] = "hello";printf("%d\n",mystrlen(str));return 0;
}

 2.strcpy函数

char* strcmp(const char* destination,const char* source);

        字符串拷贝函数,将源头的数据拷贝到目的地数组去,具体的应用场景是,需要把一个字符串传给字符数组的时候。

         这个函数有一个缺点,那就是字符串本身含'\0'的时候,拷贝字符串会不完整。这是因为函数内部是按照'\0'作为字符串的终止符,只会拷贝‘\0’及之前的字符。

常见的错误:

下图中p所指向的是一个常量字符串,内容是无法更改的。

2.1 模拟实现

        需要注意的是,这里返回的是目标字符数组的起始地址。

#include<stdio.h>
char* mystrcpy(char* dest, const char* str)
{assert(dest);char* ret = dest;assert(str);while (*str != '\0') {*dest = *str;dest++;str++;}*dest = *str;return ret; // 返回目标数组首地址
}int main()
{char str[] = "hello";char dest[20] = { 0 };mystrcpy(dest,str);//printf("%d\n",mystrlen(str)); printf("%s\n",dest);return 0;
}

 3. strcat函数

char* strcat(const char* destination,const char* source);

字符串追加,将源字符串追加到目的字符串。

3.1 模拟实现

#include<stdio.h>
#include<assert.h>
char* mystrcat(char* dest,const char* source) 
{assert(dest && source);char* ret = dest;while (*dest != '\0') {dest++;}while (*source != '\0') {*dest = *source;dest++;source++;}*dest = *source; // source的\0直接给destreturn ret;
}int main()
{char str[20] = "hello ";mystrcat(str, "world");printf("%s\n",str);return 0;
}

需要注意的第一点是,不能给自己追加自己,这是因为,在覆盖'\0'之后追加最后一个\0的时候,发现之前的\0已经被覆盖掉了,所以这会陷入死循环。

4.strcmp函数

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

待续......


文章转载自:
http://airer.elldm.cn
http://bumptious.elldm.cn
http://bursarial.elldm.cn
http://arid.elldm.cn
http://beholder.elldm.cn
http://borescope.elldm.cn
http://accusal.elldm.cn
http://batchy.elldm.cn
http://algaecide.elldm.cn
http://adiaphorist.elldm.cn
http://brainwash.elldm.cn
http://autocritcal.elldm.cn
http://asterism.elldm.cn
http://apologetics.elldm.cn
http://asynchrony.elldm.cn
http://atmologist.elldm.cn
http://anastatic.elldm.cn
http://atypic.elldm.cn
http://charlotte.elldm.cn
http://canadianize.elldm.cn
http://charactery.elldm.cn
http://amadou.elldm.cn
http://aging.elldm.cn
http://briskness.elldm.cn
http://blazonment.elldm.cn
http://cabotin.elldm.cn
http://bedtick.elldm.cn
http://amice.elldm.cn
http://anthomania.elldm.cn
http://bairiki.elldm.cn
http://www.dtcms.com/a/281127.html

相关文章:

  • “ModuleNotFoundError“深度解析:Python模块导入问题的终极指南
  • PHP语言基础知识(超详细)第二节
  • OSPFv3中LSA参数
  • dbever 导出数据库表的建表语句和数据插入语句
  • 嵌入式Linux:进程间通信机制
  • AJAX 开发中的注意点
  • ASRPRO系列语音模块(第十天)
  • AI 增强大前端数据加密与隐私保护:技术实现与合规遵
  • Python 程序设计讲义(2):Python 概述
  • pc浏览器页面语音播报功能
  • 多路文件IO的几个模型
  • K-means 聚类在肺炎患者分型中的应用(简单示例)
  • 轻轻松松带你进行-负载均衡LVS实战
  • 随机奖励能提升Qwen数学表现?本质是数据污染
  • brupsuite使用中遇到的一些问题(bp启动后浏览器无法连接)/如何导入证书
  • YCQ340汽油机气缸体总成设计cad【8张】设计说明书
  • 模拟C++简易配置系统(模板类 + 全局管理)
  • 一区 Top (HPJ) | WGAS+WGCNA分析文章套路
  • 零基础学软件测试:超详细软件测试基础理论知识讲解
  • 【实时Linux实战系列】使用系统调用实现实时同步
  • Java项目:基于SSM框架实现的学生档案管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
  • 智能体技术深度解析:从概念到企业级搭建指南
  • 自学java,什么书比较好?
  • MaxKB使用笔记【持续ing】
  • LeetCode 1888. 使二进制字符串字符交替的最少反转次数
  • 维基框架发布 1.0.11 至中央仓,深化国产化 DevOps 生态整合
  • 3-Nodejs-使用fs文件系统模块
  • kotlin的自学笔记1
  • 文心一言开源版部署及多维度测评实例
  • Listener(监听器)