字符串函数主要有这些
这些都是库里的函数可以直接使用,这里主要讲以下它的用法和模拟实现
另外在这里介绍一个学习网页http://www.cplusplus.com,可以在上面搜索相关的函数等
- strlen 求字符串长度函数
- strcpy 字符串拷贝函数
- strcat 字符串追加函数
- strcmp 字符串比较函数
strlen: 计算字符串长的函数
这是一个库里面的函数我们可以直接使用,比如:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要引用的头文件
int main()
{
char arr[8]="abcdefg";
printf("%d\n",strlen(arr));
system("pause");
return 0;
}
来看一下运行结果:
可以看到 strlen 函数可以直接计算出字符串的长度;但要注意的是:
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的
那么strlen 具体是如何实现的呢?来看代码:
非递归:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
size_t my_strlen(char *arr)//注意返回值是一个无符号整形的
{
char *str=arr;//数组首元素地址给到str str类型是 char *
int count=0;
while(*str!='\0')
{
count++;
str++;//不断向后移动,进行判断
}
return count;
}
int main()
{
int ret;
char arr[8]="abcdefg";
ret=my_strlen(arr);
printf("%d",ret);
system("pause");
return 0;
}
递归实现:
size_t my_strlen1(char *arr)
{
if(*arr== '\0')
return 0;
else
return 1+my_strlen1(arr+1);
}
strcpy : 字符串拷贝函数。
首先来看一下strcpy在cplusplus中的解释:
首先它的返回类型是一个 char *
是把source源字符串 复制拷贝到目标字符串 dst中
注:
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。而const 保证源字符串不被修改
接下来看一下strcpy的功能和模拟实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>//assert函数头文件
char * my_strcpy( char *dst, const char * src)
{
char *ret=(char *)dst;
assert(dst&&src);//判断两个字符串不为空,当表达式为0时程序终止执行
//但只在Debug版本中生效,Release终会忽略
while(*dst++=*src++)
{
;//这里进行一个空循环
}
return ret;
}
int main()
{
char dst[6]="hello";
char src[6]="world";
char *ret;
ret=my_strcpy(dst,src);
printf("%s\n",ret);
system("pause");
return 0;
}
再来看运行结果:
strcat : 字符串追加函数。
也是一个字符串操作函数,先来看一下它的形式:
可以看到和strcpy在形式上是一样的,但他们的含义却不一样
strcat 就是把源字符串追加拷贝到目标字符串中,需要注意以下几点:
源字符串必须以 ‘\0’ 结尾
目标字符串必须足够大,能够容纳源字符串。
目标空间可以被修改
来看strcat的作用和具体模拟实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char * my_strcat(char *dst1,const char *src1)//模拟实现
{
char *ret=dst1;
assert(dst1&&src1);
while(*dst1)
{
dst1++;//找到dst的末尾
}
while(*dst1++=*src1++)//将src的内容追加到dst后面
{
;
}
return ret;
}
int main()
{
char dst1[20]="hello";
char *src1="world";
char dst2[20]="hello";
char *src2="world";
char *ret;
char*temp;
temp=strcat(dst2,src2);
ret=my_strcat(dst1,src1);
printf("%s\n",ret);
printf("%s\n",temp);
system("pause");
}
再看运行结果:
strcmp : 字符串比较函数。
先来看一下它的形式:
可以看到这是一个返回值为 int 类型的函数,那么它返回什么呢?来看一下cplusplus中的解释
可以看到它会返回三个值小于返回一个负数,相等返回0,大于返回一个正数。
那么具体的使用和模拟实现看代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int my_strcmp( const char* str1,const char *str2)
{
assert(str1&&str2);
while((*str1!='\0')&&(*str2!='\0'))
{
if(*str1>*str2)
{
return 1;
}
if(*str1<*str2)
{
return -1;
}
str1++;
str2++;
if(('\0'==*str1)&&(*str2=='\0'))
{
return 0;
}
}
}
int main()
{
int ret;
char *str1="abc";
char *str2="aac";
char *str3="ab";
char *str4="ac";
char *str5="abcd";
char *str6="abcd";
ret=my_strcmp(str1,str2);
printf("%d\n",ret);
printf("%d\n",strcmp(str3,str4));
printf("%d\n",strcmp(str5,str6));
system("pause");
return 0;
}
来看运行结果:
可以看到strcmp是逐个字符进行比较的,而比较的也是字符的ASCII码,只要有一个比另一个打就停止比较。这个函数主要用来判断两字符串是否相等。