iqidan

导航

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;

}

 

posted on 2015-01-19 20:12  iqidan  阅读(111)  评论(0)    收藏  举报