欢迎来到博主的专栏——C语言进阶指南
博主id:reverie_ly
C语言标准定义了一系列有关字符串操作的函数,编译器会根据标准中的定义实现这些函数,
并将这些字符串函数定义在头文件<string.h>中
如果想要使用这些字符串函数,需要在包含这个头文件
#include<string.h>
1、strlen()——字符串长度计算函数
该函数的计算方式是从传进函数的地址值的第一个元素开始,直到结束标志‘’之间的所有元素的长度作为函数的返回值。
字符串必须有结束标志‘’,否则返回值将是一个随机值(strlen函数继续在内存中寻找‘’,返回值是从目标地址到‘’的元素长度)。
函数的返回值是size_t.由定义可知,size_t类型实质上是unsigned int类型。
char ch[12] = { "hello,world" };
strlen(ch);//返回值为11
也可以传递字符串的其他元素,此时函数的返回值是以传入的元素为起始,一直到‘’之间的字符个数
strlen(&ch[4]);//将字符串中的第五个元素的地址传入函数中
自定义strlen函数的实现
前面已经知道了strlen函数的原理
(1)函数原型的参数是字符串的地址
(2)函数的返回值是size_t类型(size_t定义在<stdio.h>中)
(3)函数从传入的地址为起始位置,一直计算到’’之间的字符个数
#include<stdio.h>
size_t my_Strlen(const char*str);
为了实现(3),我们将指针从起始位置逐个解引用,判断是否为‘’,不是‘’就给计数增加1.
size_t my_strlen(const char* pstr)
{
size_t count = 0;
while (*pstr != 0)
{
count++;
pstr++;
}
return count;
}
size_t my_strlen(const char* pstr)
{
size_t count = 0;
while (*pstr++&&++count);//这里是利用了&&的的特性,如果大家感兴趣
//可以去看看博主那篇关于逻辑运算符的文章哦~
return count;
}
2、strcpy——字符串拷贝函数
将source地址的字符串(从开始地址到结束标志)拷贝到destination字符串中去。
1)目的字符串必须能被修改。
2)目的字符串的容量需要大于原字符串。
3)原字符串需要有结束标志‘’
char str1[20]="reverie";
char str2[20]="hello";
strcpy(str1,str2);
strcpy会将str2中的字符串(从首元素到‘’之间的所有字符,包括‘’)拷贝到str1中。
strcpy的模拟实现
返回类型是目的字符串的地址,参数是两个字符型指针,源字符串不更改,使用const固定变量。
char* my_strcpy(char*destination,const char*source);
一直到打印完源字符串(从起始地址到结束标志)
实现这个功能可以将source指向的元素传到destination指针指向的元素中,接着两个指针继续拷贝后边的字符,直到source拷贝完‘’
char* my_strcpy(char* destination, char* source)
{
char* ret = destination;//保存起始地址
while (source != '')
{
*destination = *source;
destination++;
source++;
}
*destnation=*source;
return ret;//拷贝完成后返回起始地址
}
跳出循环后需要加上一句*destination=*source,这是因为循环结束的条件是*source!=‘’(如果不限定的话会死循环),但是根据上面实现的结果来看,source字符串的第一个’’是要被读入进去的,所以在循环结束后需要加上*destination=*source;
(而且字符串是一个从起始字符一直到第一个字符串结束符号‘’组成的字符集合,不录入是不能算作拷贝一个字符串的)
稍微润色一下变成
char* my_strcpy(char* destination, char* source)
{
char* ret = destination;
while (*source++ = *source++);
return ret;
}
3.strcat——字符串追加函数
将source字符串的所有字符追加到destination字符串,具体实现是将source字符串的首元素开始依次附加到destination字符串的第一个结束标志‘’。返回值为追加后的destination字符串的地址
char str1[12]="hello";
char str2[]=",world";
strcat(str1,str2);
1)目标字符串的空间需要足够大(能够容纳追加后的字符个数)
2)源字符串需要有结束标志
3)源字符串不能被修改(所以不能自己追加自己)。
4)目标字符串能被修改
strcat的模拟实现
(1)源字符串不能被修改,用const修饰指针。
(2)函数的返回值是指向目的字符串的指针。
(3)将原字符串追加到目的字符串。从目的字符串的第一个字符串结束标志开始追加
由(1)(2)可以得出strcat的函数原型
char* my_strcat(char*destnation,const char*source);
实现(3)的方法是:
先将指针指向目的字符串的第一个字符串结束标志处。
将源字符串的元素依次拷贝到目的字符串的指针处的元素。
char* my_strcat(char* destination, const char* source)
{
char* ret = destination;
while (*destination != '')
destination++;
while (*source != '')
{
*destination = *source;
destination++;
source++;
}
*destination=*source;
return ret;
}
稍微润色一下变成
char* my_strcat(char* destination, const char* source)
{
char* ret = destination;
while (*destination)
destination++;
while (*destination++ = *source++);
return ret;
}
4、strcmp——字符串比较函数
将字符串中的每个字符依次对比大小(ASCII码值),若大于则返回1,小于则返回-1,若相同,则继续对比双方字符串下一个元素,直到某一方出现不同的值或出现字符串结束标志‘’,若自始至终对比的双方字符串中的每一个元素都相等,则返回值为0.
不同的编程环境下返回值的结果不同,在vs中返回值为1,0,-1,而gcc中返回值为判定元素(被比较的字符)之间ASCII码值的差值。
以上例为例,str1与str2进行字符串比较时,‘w’与‘w’相等,继续比较下一个。‘o’与‘o’相等,继续比较下一个。‘r’与‘r’相等,继续比较下一个。‘l’与‘d’比较,不相等,由于‘l’的ASCII码值比‘d’大,函数的返回值大于0.
‘w’和‘w’相等,比较下一个,以此类推,当某一个字符串比较到‘’时,停止比较,此时判断双方对应比较的字符是否都是‘’,如果一致,则判断这两个字符串相等。
strcmp的模拟实现
(1)函数的返回值是有符号型(有负数,有正数)
(2)对比过程中不对字符串的数据进行修改,可以用const修饰函数参数。
(3)将字符串的元素依次比较大小,满足上面的规则
根据(1)(2),可以确定函数原型
char* my_strcmp(const char*str1,const char*str2)
{
char* my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
return 0;
}
}
如果想要模拟的是gcc编译器的strcmp实现效果的话,模拟实现应该是。
char* my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (!str1)
return 0;
str1++, str2++;
}
return *str1 - *str2;
}
加了限定条件的字符串操作函数
strcpy,strcmp,strcat的限定条件都是字符串结束标志‘’。为了达到更灵活的效果(比如只拷贝字符串的前几个字符,而不用一直拷贝到‘’)。C语言推出了加了限定条件的字符串操作函数:strncpy,strncmp,strncat。
依次对比strcpy,strcat,strcmp的声明我们发现其多出一个size_t的参数count。这是用来计算参与函数的字符串中的限定元素个数。
由strncpy的模拟实现我们可以知道syrncpy的特点是1)将源字符串的前n个字符传递到目的字符串,若原字符串的字符数小于n,则其余字符(n-已修改字符)改为‘。
strcmp一直对比到某一方出现‘’或不同,strncmp是依次对比前n个字符是否相等。但是当strncmp中的前n个字符串中存在‘’也会停止对比。
这些函数无非就是在原有的函数原型上加上了一个限定条件count,这个count是限定了需要参与这个函数的字符的最大个数。
更多的库函数
也可以使用msdn软件来查看这些库函数的使用方法以及函数的返回类型。
(可以私信博主来获取msdn软件哦~)
原文地址:https://blog.csdn.net/2301_77239666/article/details/134627213
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7247.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!