admin管理员组文章数量:1794759
剖析C语言字符串函数
前言:
这是一篇关于C语言字符串函数详解的文章,里面不仅包含我们常见的strlen、strcpy、strcat等,也包含不太常见的strstr、strtok、strerror等,这篇文章不仅仅讲解他们的使用方法,还剖析了这些函数的底层原理,大部分我们都可以自己模拟实现。希望对大家有帮助~
一、strlen函数
功能:
统计字符串中\0前面出现的字符个数
参数和返回值:
返回类型是无符号整型,参数是字符指针
注意事项:
- 字符串以\0作为结束标志,strlen函数返回的字符串中\0前面出现的字符个数(不包含\0)
- 参数指向的字符串必须要以\0结束
- 注意函数的返回值为size_t,是无符号的(易错)
- 学会strlen函数的模拟实现
返回值是无符号的易错点:
代码语言:javascript代码运行次数:0运行复制int main()
{
if (strlen("abc") - strlen("abcd") > 0)
printf(">\n");
else
printf("<\n");
return 0;
}
这段代码的输出结果是>,这是为何?
就是因为strlen函数返回无符号数,前者是无符号数3,后者是无符号数4,3-4=-1。
在数值上是-1,但是-1的补码是全1,又因为无符号数原码反码补码相同,所以最后表达式的结果就是全1,一个非常大的正数。
strlen函数的模拟实现
既然要实现,我们就要知道底层原理。
计算的就是\0之前出现的字符个数,那么就有计数器的算法。
1、计数器算法
代码语言:javascript代码运行次数:0运行复制//方法一、计数器法
size_t my_strlen(const char* str)
{
size_t cnt = 0;
while (*str++)
{
cnt++;
}
return cnt;
}
int main()
{
size_t sz= my_strlen("bcd");
printf("%u\n", sz);
return 0;
}
2、递归算法
代码语言:javascript代码运行次数:0运行复制//法三、递归
size_t my_strlen(const char* str)
{
if (*str)
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
int sz = my_strlen("abcd");
printf("%d\n", sz);
return 0;
}
3、指针减去指针
代码语言:javascript代码运行次数:0运行复制//法二、指针相减
size_t my_strlen(const char* str)
{
char* start = str;
char* end = str+2;
while (*end++)
{
;
}
end--;
return (size_t)(end - start);
}
指针减去指针得到的是两个指针之间相差的元素个数!
二、strcpy函数
功能:
拷贝字符串,将一个数组的字符串拷贝到另一个数组中,并且必须将\0拷贝过去,到\0停止。
参数和返回值
第一个参数是目标字符串的地址,第二个参数是源字符串的地址。
返回值是目标字符串地址
注意事项:
- 源字符串必须以\0结束
- 会将源字符串中的\0拷贝到目标空间
- 目标空间必须足够大,以确保能存放元字符串
- 目标空间必须可变
比如char *arr = " abcdef "
这里的arr就是不可改变的,因为
本文标签: 剖析C语言字符串函数
版权声明:本文标题:剖析C语言字符串函数 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754812268a1706764.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论