C语言-字符串函数的实现(一)之strlen
C语言中的字符串函数有如下这些
- 获取字符串长度
- strlen
- 长度不受限制的字符串函数
- strcpy
- strcat
- strcmp
- 长度受限制的字符串函数
- strncpy
- strncat
- strncmp
- 字符串查找
- strstr
- strtok
- 错误信息报告
- strerror
接下来看看如何实现它们
获取字符串长度
strlen
我们看看文档是怎样说的,如下
size_t strlen ( const char * str );
Get string length
获取字符串长度
Returns the length of the C string str.
返回C字符串str的长度
The length of a C string is determined by the terminating null-character: A C string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).
C字符串长度是由'\0'来确定的,也就是说从字符串的第一个开始只要遇到'\0'就结束长度计算(不包含'\0')
This should not be confused with the size of the array that holds the string. For example:
不用困惑你创建的数组的大小,比如这样
char mystr[100]="test string";
defines an array of characters with a size of 100
chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, whilesizeof(mystr)evaluates to100,strlen(mystr)returns11.定义一个大小为100的数组
mystr,然后mystr就已经被初始化为一个长度为11的字符串了。所以呢,sizeof(mystr)会得出100, 而strlen(mystr)会返回11.
综上,可以知道
- 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
- 该函数只认'\0',参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的
实现
strlen函数的实现有好几种。
比如
- 计数器的方法
- 递归
- 指针 - 指针
接下来一一实现。
1. 计数器:使用一个变量来记录 - count
断言指针不为空是个好习惯~
int my_strlen(char* str)
{
int count = 0;
assert(str != NULL);
while (*str != '\0') // while (*str)
{
count++;
str++;
}
return count;
}
就一直找'\0',当*str不是'\0'时,就count++,str++,直到遇到'\0'停止,然后返回count就是长度了。
2. 递归
断言指针不为空是个好习惯~
int my_strlen(char* str)
{
assert(str != NULL);
char* p = str;
while(*p == '\0')
{
return 0;
}
return 1 + my_strlen(p + 1);
}
比如传入的str地址为 1000
那么 1 + my_strlen(p + 1) 中,p + 1,指针偏移后就是1001,以此类推。
1 + 1 + my_strlen(p + 1)
1 + 1 + 1 + my_strlen(p + 1)
1 + 1 + 1 + 1 + my_strlen(p + 1)
...
1 + 1 + 1 + 1 + ... + 0
最终就可以得出长度。
3. 指针-指针
断言指针不为空是个好习惯~
int my_strlen(char* str)
{
assert(str != NULL);
char* p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
把指针str的地址赋值给一个新的指针p,str作为指向起始地址的指针,不改变它,记录起始地址。
然后通过指针p进行查找'\0',判断当前字符是否为'\0',不是就进行p++,然后继续判断下一个字符,如此循环,直到指针p找到'\0',然后用 当前的指针p 减去 起始指针str 进行返回,就是长度了。
C语言-字符串函数的实现(一)之strlen的更多相关文章
- 13-C语言字符串函数库
目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...
- C语言字符串函数大全
C语言字符串函数大全 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include ...
- C语言-字符串函数的实现(五)之strstr
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- C语言-字符串函数的实现(二)之strcpy
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- C语言字符串函数例子程序大全 – string相关
关于字符串函数的应用细则,例子程序 – jerny 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source) ...
- 07 --C语言字符串函数
1)字符串操作 复制 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strdup(char *str) 将串拷贝到新建的位置处 ...
- 关于C语言字符串函数使用的一点心得
就字符串的拼接函数为例strcat. 原型:extern char *strcat(char *dest,char *src);用法:#include <string.h> 功能:把src ...
- C语言字符串函数
strtok() 字符串分割函数strstr() 字符串查找函数 范例 #include <string.h> main() { char * s = " ...
- c语言字符串函数大全(转)
函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio. ...
随机推荐
- 同样是NGK官方推出的代币,SPC与BGV有何异同?
近日,币圈又火热了起来,而这次火热是由NGK搅动的.原来,NGK官方空投了200万枚SPC,用于奖励NGK算力持有者.当前,已经有一部分算力持有者获得了SPC奖励,有的算力持有者获得的SPC数量惊人, ...
- CAD颜色对照表
cad颜色代码与RGB参数对应表 1 255 0 02 255 255 03 0 255 04 0 255 2555 0 0 2556 255 0 2557 0 0 08 128 128 1289 1 ...
- 🎊 Element UI 新春快报
新年好,Element UI 开发团队给各位支持我们的开发者们拜个晚年,祝大家在新的一年里工作没 bug, 天天不加班. 在过去一年里,Element UI 团队在稳定维护 Vue 2.x 版本的同时 ...
- Java基本概念:内部类
一.简介 描述: 很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了. 内部类不是在一个java源文件中编写两个平行的类,而是在一个类的内部再定义另外一个 ...
- loadrunner学习笔记一
这篇笔记主要是针对一个具体的loadrunner脚本里面出现的方法进行解释,具体脚本如下: ` Action() { char *transactionName = "Test"; ...
- MySQL注入流程
目录 确认注入点 信息收集 数据获取 提权 写个MySQL注入流程的大纲,类似一份全局地图,能指导下一步工作.MySQL注入流程分为四步: 确认注入点 信息收集 数据获取 提权 确认注入点 参考:ht ...
- 5G时代,为什么NoSQL和SQL存在短板?
01 介绍 当今的通信服务提供商(CSP)需要能够在处理海量复杂的数据的同时,不会下降或者减慢网路响应速度和可靠性.5G时代,设备和用户数量呈指数级增长,这对业务支持服务(BSS)提出了新需求,也成为 ...
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- HDOJ-6656(数论+逆元)
Kejin Player HDOJ-6656 设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也 ...
- 恭喜!Apache Hudi社区新晋两位Committer
1. 介绍 经过Apache Hudi项目委员会讨论及投票,向WangXiangHu和LiWei 2人发出Committer邀请,2人均已接受邀请并顺利成为Committer,也使得Apache Hu ...