C语言中的字符串函数有如下这些

  • 获取字符串长度

    • strlen
  • 长度不受限制的字符串函数
    • strcpy
    • strcat
    • strcmp
  • 长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 错误信息报告
    • strerror

接下来看看如何实现它们

获取字符串长度

strlen

我们看看文档是怎样说的,如下

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, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.

定义一个大小为100的数组mystr,然后mystr 就已经被初始化为一个长度为11的字符串了。所以呢, sizeof(mystr) 会得出 100, 而strlen(mystr) 会返回 11.

综上,可以知道

  1. 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  2. 该函数只认'\0',参数指向的字符串必须要以 '\0' 结束。
  3. 注意函数的返回值为size_t,是无符号的

实现

strlen函数的实现有好几种。

比如

  1. 计数器的方法
  2. 递归
  3. 指针 - 指针

接下来一一实现。

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 进行返回,就是长度了。

最新文章

  1. Nginx如何处理一个请求
  2. C#的类,构造函数以及Array阵列的数据填充与绑定
  3. ahjesus动态生成表达式树
  4. POJ 3903:Stock Exchange(裸LIS + 二分优化)
  5. cf卡中,wtmp文件较大,导致磁盘空间满了
  6. 一款基于jQuery底部带缩略图的焦点图
  7. android 首开机会在数据链接图标的状态栏打开并自行消失主动
  8. 更快的memcpy
  9. 在JavaScript中创建命名空间的几种写法
  10. 初学 Java Script (数据类型)
  11. Saltstack批量编译部署nginx(多模块)
  12. 【3】Asp.Net Core2.2新版管道处理模型
  13. solr之环境配置一
  14. Html和Css学习笔记-html进阶-div与span
  15. Maven设置本地仓库路径
  16. 【10-2】复杂业务状态的处理(从状态者模式到FSM)
  17. N体运动的程序模拟
  18. htm5之视频音频(shit IE10都不支持)
  19. 【微信开发】PC端 微信扫码支付成功之后自动跳转
  20. I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard.sh hacking

热门文章

  1. Mybatis【20】-- Mybatis延迟加载怎么处理?
  2. sun公司和apache使用ftpclient的区别
  3. 谈一下hashMap中put是如何实现的?
  4. Django框架-cookie和session以及中间件
  5. keras报错:AttributeError: '_thread._local' object has no attribute 'value'
  6. Kubernetes Container lifecycle hooks
  7. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
  8. pytorch(09)transform模块(基础)
  9. mysql查询缓存简单使用
  10. 2020年12月-第02阶段-前端基础-Day06