大家好,今天我们来实现strlenstrcpy,strcat,strcmp这些长度不受限制的字符串函数的模拟实现。
1.strlen:
我们首先了解一下strlen的注意事项:
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
含 '\0' )。
size_t strlen ( const char * str );
参数指向的字符串必须要以 '\0' 结束
注意函数的返回值为size_t,是无符号的( 易错 )。
以下是strlen功能的实现:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";//要注意arr里面放的abcdef\0
int len = strlen(arr);
printf("%d", len);
char arr1[] = { 'b','i','t' };
int len1 = strlen(arr1);//随机值
//返回类型是size_t 是 unsigned int 的类型
}
模拟实现strlen:
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
size_t count = 0;
assert(str);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t n = my_strlen(arr);
printf("%u\n", n);
return 0;
}
2.strcpy:
注意事项:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
以下是strcpy功能的实现:
#include<stdio.h>
int main()
{
char arr[100] = { 0 };//源字符串必须以 '\0' 结束。
strcpy(arr, "zhangsan");//会将源字符串中的 '\0' 拷贝到目标空间。
printf("%s", arr);
}
模拟实现strcpy:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char*arr2,const char*arr1)
{
assert(arr1);
assert(arr2);
char* ret=arr2;
while (*arr2++ = *arr1++)//这样写可以保证arr1里面的'\0'可以给到arr2里面
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
3.strcat:
注意事项:
char * strcat ( char * destination, const char * source )
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
以下是strcat的模拟实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
my_strcat(arr1, "world");
printf("%s\n", arr1);
return 0;
}
4.strcmp:
注意事项:
int strcmp ( const char * str1, const char * str2 );
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字.
第一个字符串等于第二个字符串,则返回0.
第一个字符串小于第二个字符串,则返回小于0的数字.
以下是strcmp的模拟实现:
模拟实现strcmp
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char *str1,const char*str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')//这里是相等的情况 因为比较到都遇到'\0'了 所以返回0
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char arr1[] = "zhangsan";
char arr2[] = "zhangsanfeng";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf(">\n");
}
else if (ret < 0)
{
printf("<\n");
}
else
printf("==\n");
}
以上便是四种函数的模拟实现,希望对大家有所帮助。