模拟实现strlen,strcpy函数
原创
©著作权归作者所有:来自51CTO博客作者honeyR的原创作品,请联系作者获取转载授权,否则将追究法律责任
模拟实现strlen,strcpy函数
strlen
是计算机C语言函数,计算字符串s的(unsigned int型)长度,不包括'\0'在内。strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
(1)计数器
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<assert.h>
unsigned int Is_strlen(char *arr)
{
int count = 0;
assert(arr != NULL);
while (*arr != '\0')
{
count++;
*arr ++;
}
return count;
}
int main()
{
char *arr = "I Love You!" ;
int ret=Is_strlen(arr);
printf("%d\n",ret);
system("pause");
return 0;
}
(2)指针减指针
unsigned int my_strlen(const char* str)
{
const char* src= str;
while (*src != '\0')
{
*src++;
}
return (src - str);
}
int main()
{
const char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d\n", ret);
system("pause");
return 0;
}
(3)递归
int my_strlen(const char* str)
{
if (*str == NULL)
{
return 0;
}
else
return 1 + my_strlen(++str);
}
int main()
{
const char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d\n", ret);
system("pause");
return 0;
}
strcpy
把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的 地址空间
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<assert.h>
void Is_strcpy(char *dest, const char *str)
{
assert(dest !=NULL);
assert(str != NULL);
while (*str!='\0')
{
*dest++ = *str++;
}
*dest = *str;
}
int main()
{
char arr[20] = {0};
char *p = "Hello World!";
Is_strcpy(arr,p);
printf("%s\n", arr);
system("pause");
return 0;
}
若要求按strcpy的原型参数设计函数,则以上是不太好的,strcpy要求返回一个指针,如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<assert.h>
char *Is_strcpy(char *dest, const char *str)
{
assert(dest != NULL);
assert(str != NULL);
char *src = dest; //记住目标空间首地址
while (*str != '\0')
{
*src++ = *str++;
}
*src = *str;
return dest;
}
int main()
{
char arr[20] = { 0 };
char *p = "Hello World!";
Is_strcpy(arr, p);
printf("%s\n", arr);
system("pause");
return 0;
}