strlen的模拟实现(求字符串长度)
字符串以’\0’作为结束标志,strlen函数返回的是字符串中‘\0’前面出现的字符的个数(不包含’\0‘).
size_t strlen(const char* str)
计数器方法
//计数器方法模拟实现strlen--->计算字符串长度;
#include<stdio.h>
int my_strlen(char* str)//将字符串首地址传到函数
{
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int ret=my_strlen(arr);//将字符串首地址传到函数
printf("%d", ret);
}
递归模拟实现strlen计算字符串长度
//用递归模拟实现strlen函数求字符串长度
int my_strlen(char* str1)
{
if (*str1 == '\0')
return 0;
else
return 1 + my_strlen(str1 + 1);
}
int main()
{
char arr[] = "abcdef";
int ret=my_strlen(arr);
printf("%d", ret);
}
用指针- 指针的方式模拟实现strlen函数
int my_strlen(char* str)
{
char* s = str;
while (*str != '\0')//当str指针指向‘\0',跳出循环
{
str++;
}
return str - s;
}
int main()
{
char arr[] = "abcdef";
int ret=my_strlen(arr);
printf("%d", ret);
}
strcpy的模拟实现
char* strcpy(char* destination,const char* source);
- 源字符串必须以’\0‘结束;
- 会将源字符串中的’\0‘拷贝到目标空间;
- 目标空间必须足够大,以确保能够存放字符串;
- 目标空间必须可变。
#include<stdio.h>
#include<assert.h>//assert头文件
//src源字符串,dest目标空间
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;//将目标空间的首地址保存到ret
assert(dest != NULL);//断言,如果是空指针,表明程序出错,会终止程序
assert(src != NULL);
/*while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src++;*/
//利用后置++,先赋值,然后指针++,当为空时就会跳出循环
while (( * dest++ = *src++))
{
;
}
return ret;
}
int main()
{
//将数组arr1的内容拷贝到数组arr2中
char arr1[] = "abcdef";
char arr2[100] = { 0 };//初始化
char* ret =my_strcpy(arr2, arr1);
printf("%s", ret);//输出ret指向的字符串
}
模拟实现strcat函数
- 给字符串追加字符串
- 源字符串必须以’\0’结束
- 目标空间足够大,能容纳下源字符串的内容
- 目标空间必须可修改
char* stract(char* destination,const char* source)
#include<stdio.h>
#include<assert.h>//assert()函数的头文件
char* my_strcat(char* dest, const char* str)
{
assert(dest && str);//断言,如果是空指针返回错误信息
char* ret = dest;//把目标追加的首地址保存起来先
//找到'\0'就停下来
while (*dest != '\0')
{
dest++;
}
//追加字符串
//*str不为空,就赋值给*dest
while (*str)
{
*dest = *str;
dest++;
str++;
}
/*while(*dest++=*str++)
{
;
}
*/
//返回目标函数首地址,打印字符串
return ret;
}
int main()
{
char arr1[40] = "hello";//要有\0,要足够大
char arr2[20] = "tomato";//把字符串arr2追加到arr1
char* ret=my_strcat(arr1, arr2);
//也可以 char* ret = my_strcat(arr1, "tomato");
printf("%s", ret);
return 0;
}
模拟实现strcmp函数
作用:比较两个字符串的大小
一一对比,对比的字符ASCII码值的大小
返回值:
- 第一个字符串大于第二个字符串,返回大于零的数字
- 第二个字符串大于第一个字符串,返回小于零的数字
- 第一个字符串等于第二个字符串,返回零。
int strcmp(const char* str1 , const char* str2)//返回值int类型的
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}//不相等就会跳出循环
//str1小于str2返回小于零的数
if (*str1 < *str2)
return -1;
//str1大于str2返回大于零的数
else if (*str1 > *str2)
return 1;
// //简化
// return(*str1 - *str2);//如果str1大于str2的值,返回一个大于零的数
// //如果str1小于str2的值,返回一个小于0的值
}
int main()
{
char arr1[40] = "hello";
char arr2[20] = "tomato";
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
strncpy模拟实现—>拷贝n个函数到目标函数
函数声明
char *strncpy(char *dest, const char *src, size_t n)
从源字符串拷贝n个字符到目标空间
如果源字符串的长度小于n,那么拷贝完源字符串以后,在后面追加零,直到n个为止,即目标函数剩余部分用空字节填充
注意,在使用strnpy函数时,不会自动添加终止符,需要自己加上终止符(‘\0’)
或者在函数初始化的时候,将目标函数里面都填充上’\0’
比如用memset()函数–>复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符(将前n个字符覆盖为字符c)
//void *memset(void *str, int c, size_t n)
int main()
{
char arr[40] = { 0 };
char str[] = "hello man!";
memset(arr, '\0', sizeof(arr));//填充‘\0’
strncpy(arr, str, 5);
printf("%s\n", arr);
return 0;
}
#include<stdio.h>
//strncpy()模拟实现
char* my_strncpy(char* dest, char* src, size_t n)
{
int i = 0;
char* ret = dest;//将目标字符串的首地址保存下来。
for (i = 0; i < n; i++)
{
*dest = *src;
dest++;
src++;
}
// *dest = '\0';//要加上‘\0',
//拷贝的时候并没有把\0拷贝过去,没有'\0'会出问题
return ret;
}
int main()
{
char arr[40] = { 0 };
char str[] = "hello man!";
char* ret=my_strncpy(arr, str, 7);
printf("%s\n", ret);
return 0;
}