摘要
用C语言实现strlen、strcmp、strncmp、strcpy、strncpy、strstr
strlen()
size_t strlen (const char *str)
// 计算字符串str的长度,直到空结束字符,但不包括结束字符。返回字符串的长度。
//strlen()
size_t myStrlen (const char* str1)
//问题:未判断空指针传参
{
int i=0;
int len = 0;
while (str1[i] != '\0')
{
len++;
str1++;
}
return len;
}
/*
判断当str[i]不等于\0时,进入while循环,长度len+1,str+1,直到不满足跳出循环,输出len。
测试用例:str = {“Hello world”};
测试结果:总共有11个字符
*/
strcmp() 和 strncmp()
int strcmp (const char *str1, const char *str2)
// 把str1所指向的字符串和str2所指向的字符串进行比较。
// 若str1<str2,返回值小于0;若str1=str2,返回值等于0;若str1>str2,返回值大于0。
int strncmp (const char *str1, const char *str2, size_t n)
// 把str1和str2进行比较,最多比较前n个字节。
// 若str1<str2,返回值小于0;若str1=str2,返回值等于0;若str1>str2,返回值大于0。
//strcmp()
int myStrcmp (const char* str1, const char* str2)
//问题:当*str1或*str2指向为'\0'时缺少return返回
{
if ((str1 == NULL) || (str2 == NULL))
{
return -1;
}
if (str1 == str2)
{
return 0;
}
while ((*str1 != '\0') || (*str2 != '\0'))
{
if (*str1 > *str2)
{
return (*str1 - *str2);
}
else if (*str1 < *str2)
{
return (*str1 - *str2);
}
else if (*str1 == *str2)
{
str1++;
str2++;
}
else
{
return -1;
}
}
}
/*
字符串str1和str2判空,不为空则判等,相等则返回0,
若不等,判断其中一个字符串是否结束,若某一字符串先结束则输出差值,若相等字符串均为结束则自加。
测试用例:str1 = {“Hello world”}; str2 = {“Hello world!”};
测试结果:-33
*/
//strncmp
int myStrncmp (char *str1, const char* str2, int m)
//问题:未判断空指针传参
{
if (!m)
{
return 0;
}
while (--m && *str1 && (*str1 == *str2))
//问题:未控制m不为负数
{
str1++;
str2++;
}
return (*str1 - *str2);
}
/*
判断需要比较的字节长度m不为0,当字符相等且不为’\0’时比较下个字符,直到m=0;当字符不相等时直接返回差值。
测试用例:str1 = {“Hello world”}; str2 = {“Hello world!”}; m=5;
测试结果:0
测试用例:str1 = {“Hello world”}; str2 = {“Hello world!”}; m=15;
测试结果:-33
*/
strcpy() 和 strncpy()
char *strcpy (char *str1, const char *str2)
// 把str2所指向的字符串复制到str1,返回一个指向最终目标字符串str1的指针。
char *strncpy (char *str1, const char *str2, size_t n)
// 把str2所指向的字符串复制到str1,最多复制n个字符,当str2的长度小于n时,str1的剩余部分将用空字节填充。返回最终复制的字符串。
//strcpy
char *myStrcpy (char *str1, char *str2)
//问题:未判断空指针传参
{
char *temp = str1;
while (*str1++ = *str2++)
{
;
}
return temp;
}
/*
保持str1的首地址,拷贝str2指向的字符串到str1指向的地址(包含’\0’),返回str1的首地址。
测试用例:str1 = {“Hello world”}; str2 = {“world Hello”};
测试结果:world Hello
*/
//strncpy
char *myStrncpy (char *str1, const char* str2, int m)
{
char *temp = str1;
while (m)
{
*str1++ = *str2++;
m--;
}
return temp;
}
/*
拷贝保存str1的首地址,按一次复制一个字符直到m置零,返回str1首地址。
测试用例:str1 = {“Hello world”}; str2 = {“world Hello”}; m=3;
测试结果:worlo world
*/
strstr()
char *strstr (const char *str1, const char *str2)
// 在字符串str1中查找第一次出现字符串str2的位置,不包括终止符’\0’,
// 返回在str1中第一次出现str2字符串的位置,若未能找到则返回NULL。
//strstr
char *myStrstr (const char *str1, const char *str2)
{
char *temp1 = (char*) str1;
char *temp2 = (char*) str2;
char *temp0 = (char*) str1;
while (*temp1 != '\0')
{
temp0 = temp1;
temp2 = (char*) str2;
while ((*temp0 == *temp2) && (*temp2 != '\0'))
{
++temp0;
++temp2;
}
if (*temp2 == '\0')
{
return temp1;
}
++temp1;
}
return NULL;
/*
设置指针temp0、temp1、temp2,每当发现temp1所指向的字符==temp2所指向的字符时,temp0代替temp1向后走,
若temp0走到某位置时与temp2所指向的字符不相等,则temp1++,temp0范围temp1的位置,
若temp0走完与temp2匹配的全过程,则匹配成功。
测试用例:str1 = {“Hello world”}; str2 = {“ll”};
测试结果:llo world
*/
}