目录
一、字符串函数
strlen
strcpy
strcat
strcmp
strlen
计算字符串长度的函数,遇见字符串中的\0停止,计算的是\0以前的字符个数,不包含\0,函数返回值是size_t,是无符号的
下面来模拟实现strlen函数
const 修饰表示不可被修改,而assert断言则保证指针有效性
//计数的方式
int my_strlen(const char * str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
//递归
int my_strlen1(const char* str)
{
assert(str != NULL);//判断指针的有效性
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
由于在主函数中传过来的不是\0,那么就会先加一,再递归下一个字符,直到遇到\0,
//指针-指针
int my_strlen2(const char* str)
{
const char* start = str;
assert(str != NULL);
while (*str)
{
str++;
}
return str - start;//元素个数
}
strlen 是求字符串长度的,求出的长度是不可能为负数的所以返回类型设置为size_t 无符号类型是没有毛病的。
strcpy
.会将源字符拷贝到目标空间,源字符串必须以\0结束
.会将源字符串中的\0拷贝到目标空间
.目标也空间要足够大,且目标空间可变
下面来模拟实现strcpy
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;//先将目标空间起始地址存着
assert(dest && src);
while (*dest++ = *src++)//将源字符串一个字符一个字符拷贝到目标空间,遇见src中的\0就不拷贝了
{
;
}
return ret;//拷贝结束返回目标空间起始地址
}
注意程序中++是后置加加
strcat
函数原型和strcpy一摸一样
字符串追加函数strcat,同样有一下性质
。源字符以\0结束
。目标空间足够大
。目标空间可修改
模拟实现追加字符串
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1. 找目标空间的\0
while (*dest)
{
dest++;
}
//2. 追加
while (*dest++ = *src++)//和拷贝差不多
{
;
}
return ret;
}
int main()
{
char arr[20] = "hello ";
char arr2[] = "world";
my_strcat(arr, srr2);
printf("%s\n", arr);
return 0;
}
strcmp
函数原型两个字符串都是不可被修改
比较的是对应字符的ASCII值,不是字符串长度
模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)//比较不改变字符串内容
{
assert(str1 && str2);
while (*str1 == *str2)//两个字符相同就往后走再判断是否遇见\0
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
//两个字符不相等时,再判断对应字符ASCII值
/*if (*str1 > *str2)
return 1;
else
return -1;*/
return *str1 - *str2;//也可以直接返回它们相减结果
}
int main()
{
char arr1[] = "abq";
char arr2[] = "abcdef";
int ret = my_strcmp(arr1, arr2);
if (ret>0)
printf("arr1>arr2\n");
printf("%d\n", ret);
return 0;
}
好了,今天就模拟实现常见字符串函数