字符串是c语言中一种常见的数据类型,字符串属于常量,不可修改,如果我们想要修改,就要把它放在字符数组中来对其进行修改,而有一些函数可以帮助我们完成一些常用的操作字符串的动作,下面我们就来介绍一些常用字符串操作函数
strlen
strlen的作用是计算字符串的长度,但不包括最后的\0
所以我们在传参的时候要注意是不是以\0结尾的字符串
我们先来看函数原型
size_t strlen ( const char * str );
形参是用一个字符指针接收字符串的首字符地址
返回类型是个无符号的整型,因为字符串的长度肯定是个非零的数,但这里有一个地方需要注意,看下面:
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)//strlen返回的是一个无符号的整型,相减的结果数值上等于-3
//但转化为无符号整型是一个无穷大的数
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
所以打印结果是str2>str1
strlen的使用情况并不是很复杂,接下来模拟实现strlen:(解释见代码注释)
方法1:
计数器实现
int my_strlen1(const char* str)//计数器实现strlen
{
assert(str);//判断str是否为空指针
int count = 0;
while (*str++)//str先进行后置++,再进行解引用操作
//如果*str != \0,进入循环计数
{
count++;//进入循环一次使count自增一次
}
return count;//当循环结束时,count此时就是字符串的长度
}
int main()
{
char arr[] = "hello world";
printf("%d\n", my_strlen1(arr));
return 0;
}
方法2:
递归实现
int my_strlen2(const char* str)
{
if (*str)//如果*str != \0,进入递归
return 1 + my_strlen2(str + 1);//返回1+剩下的字符串长度
else//当*str = \0,返回0,此时就可计算出字符串长度
return 0;
}
int main()
{
char arr[] = "hello world";
printf("%d\n", my_strlen2(arr));
return 0;
}
方法3:
指针减指针实现
int my_strlen3(const char* str)//指针-指针实现strlen
{
assert(str);
char* start = str;//记录首字符地址
while (*str)//*str != \0时,str指针跳向下一个字符的地址
{
str++;
}
return str - start;//循环结束时,str指向最后一个字符(不是\0),
//str - start即为两者之间元素的个数,也就是字符串长度
}
int main()
{
char arr[] = "hello world";
printf("%d\n", my_strlen3(arr));
return 0;
}
我们也可以看看vs2019提供的strlen:
size_t __cdecl strlen (
const char * str
)
{
const char *eos = str;
while( *eos++ ) ;
return( eos - str - 1 );
}
求字符串长度时i,字符串不可写成arr[] = {‘a’, ‘b’, ‘c’}的形式,否则计算的是随机值,因为该数组末尾是没有\0的
strcpy
我们对数组赋值时不能写成 arr = “abcd”,arr表示的是数组名,这种赋值方式是不合法的,这时就可以使用strcpy
strcpy的作用是将一个字符串的内容拷贝到另一个字符串
strcpy的原型:
char* strcpy</