C语言的字符串操作的库函数的自我实现(1)
#include <stdio.h>
typedef unsigned long uLong;
//计算字符串的有效长度(不包括尾零)
uLong myStrlen(const char *str)
{
const char *p = str;
while(*p++ != '\0');
return (p - str - 1);
}
//把s2拷贝到s1,返回s1的值,即s1指向的地址 注意:确保s1的容量足够存储s2!!!!!
char *myStrcpy(char *s1, const char *s2)
{
char *s3 = s1;
while( (*s3++ = *s2++) != '\0');
return s1;
}
//最多只拷贝len个字符!而且拷贝到尾零结束!!!
char *myStrncpy(char *s1, const char *s2, uLong len)
{
char *s3 = s1;
// int num = 0;
// while((num++ < len) && ((*s3++ = *s2++) != '\0'));//此写法也可以,不过下面的更加节省内存
while((len-- > 0) && ((*s3++ = *s2++) != '\0'));
return s1;
}
//将s2串联到s1后面,返回s1的值,即s1指向的地址 注意:s1的容量一定要够!!!!!!
char *myStrcat(char *s1, const char *s2)
{
uLong index1 = myStrlen(s1);
uLong index2 = 0;
while((*(s1 + index1++) = *(s2 + index2++)) != '\0' );
return s1;
}
//将s2的len个字符串联到s1后面,返回s1地址,在末尾主动加'\0'!!
char *myStrncat(char *s1, const char *s2, uLong len)
{
uLong index1 = myStrlen(s1);
uLong index2 = 0;
while(index2 < len && (*(s1 + index1++) = *(s2 + index2++)) != '\0' );
*(s1 + index1) = '\0';
return s1;
}
//比较两个字符串,s1 == s2相等时返回0,否则返回非0 s1>s2:正数 s1<s2:负数(从前往后比较,以第一个不相等的字符的ASII码的差值作为返回值)
int myStrcmp(const char *s1, const char *s2)
{
while((*s1 != '\0' && *s2 != '\0') && (*s1++ == *s2++));
return (*s1 - *s2);
}
//主函数
int main(int argc, const char * argv[])
{
char s1[64] = "I ";
char s2[16] = "love share!";
char s3[] = "I ";
//myStrlen
printf("s1Len = %ld s2Len = %ld\n", myStrlen(s1), myStrlen(s2));
//myStrcpy s1 = s2
printf("s1 copy from s2 = %s\n", myStrcpy(s1, s2));
//myStrncpy s1 = s2 (s2的前四个字符, s1指向地址的4个字符长度之后的地址的其余内容不改变)
printf("s1 copy %d characters from s2 = %s\n", 4, myStrncpy(s1, s2, 4));//为什么这句输出和上一句一样?注意myStrncpy拷贝字符串的特性:(1)最多只拷贝4个字符,不会自动添加尾0('\0')(2)若拷贝到尾0('\0')也停止拷贝
//s1 = s3 (s3的前四个字符, 但是s3指向的地址,第二字符内容就是尾0了,所以就结束了!!之拷贝2个字符)
printf("s1 copy %d characters from s3 = %s\n", 4, myStrncpy(s1, s3, 4));
//myStrcat s1 = s1 + s2
printf("s1 + s2 = %s\n", myStrcat(s1, s2));
//myStrncat s1 = s1 + s2 (s2的前四个字符, 和myStrncpy和相似,只不过是在s1指向的字符串的尾部添加拷贝的字符)
printf("s1 + %d s2 = %s\n", 4, myStrncat(s1, s2, 4));
//myStrcmp
printf("s1:%s VS s2:%s = %d\n", s1, s2, myStrcmp(s1, s3));
printf("s1:%s VS s3:%s = %d\n", s1, s3, myStrcmp(s1, s3));
printf("s1:%s VS s1:%s = %d\n", s1, s1, myStrcmp(s1, s1));
return 0;
}
浙公网安备 33010602011771号