0


模拟实现库函数之字符串函数


一 、求字符串长度

  • strlen 函数

size_t strlen ( const char * str );//返回值为unsigned int类型

strlen函数是c语言的库函数,用来计算字符串的长度,遇到\0截止。

//举例
char str[]="seanyibo";
int len=strlen(str);//8

模拟实现strlen函数:

size_t my_strlen(const char* str) {
    char* start = str;
    char* end = str;
    while (*end != '\0') {
        end++;
    }
    return end - start;//指针相减即为它们之间的元素个数
}

int main() {
    char str[] = "bjyxdaydayup";
    int len=my_strlen(str);
    printf("%d", len);//12
    return 0;
}

额外说明:我们前面有提到size_t为unsigned int 类型,这是因为字符串的长度不可能为负值,下面我们用一段代码来证明它。

二 、长度不受限制的字符串函数

  • strcpy函数

char* strcpy(char* destination,const char* source);

strcoy函数是c语言的库函数,将源(source)指向的C字符串复制到目标(destination)指向的数组中,包括终止空字符(并在该点停止)。

然而,我们需要注意以下几点:

1.我们的目标数组的长度必须大于等于我们的源数组;

2.源数组中必须包含‘\0’,否则无法确定有无'\0’或者‘\0’的位置在哪儿,可能会造成数组越界,非法访问。

模拟实现strcpy函数:

char* my_strcpy(char* dest, const char* sour) {
    assert(dest);//防止传入的是空指针
    assert(sour);
    char* start = dest;
    while (*dest++ = *sour++) {//复制完\0停止
        ;
    }
    return start;//返回数组首元素地址
}
int main() {
    char str1[20] = "xxxxxx";
    char str2[] = "bjyx";
    //strcpy(str1, str2);
    my_strcpy(str1, str2);
    printf("%s", str1);
    return 0;
}
  • strcat函数

char * strcat ( char * destination, const char * source );

strcat是c语言库函数,将源字符串的内容附加到目标字符串。目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到将原字符串全部完成(包括\0结束符),并且空字符包含在由目标中的两个字符串联形成的新字符串的末尾。

举例说明:

int main() {
    char str1[20] = "bjyx";
    char str2[] = "szd";
    strcat(str1, str2);
    printf("%s", str1);//bjyxszd
    return 0;
}

然而,我们需要注意的是:

1.目标字符数组的长度必须够容纳两个字符数组;

反例:char str1[6]="abcd";char str2[]="efghi";//报错,数组越界

2.源字符串必须以‘\0’结束;

3.目标空间必须可变。

模拟实现strcat函数:

char* my_strcat(char* dest, const char* sour) {
    //找到\0位置
    assert(dest && sour);
    char* str = dest;
    while (*str != '\0') {
        str++;
    }
    //将内容复制到\0后的空间
    while (*str++ = *sour++) {//\0复制完后结束
        ;
    }
    return dest;//返回起始地址
}
int main() {
    char str1[20] = "bjyx";
    char str2[] = "szd9197";
    //strcat(str1, str2);
    printf("%s\n", my_strcat(str1,str2));//bjyxszd9197
    return 0;
}

注:strcat函数不能实现自己追加自己;因为此时的‘\0’已经被修改了。自己追加自己可以通过下述

strncat函数实现。

  • strcmp函数

int strcmp ( const char * str1, const char * str2 );

strcmp函数是c语言库函数,比较两个字符串的大小,从第一个元素开始,依次比较(比较的是对应位置上的字符的大小),并非长度。

判断字符串大小的例子如下图:

strcmp函数模拟实现:

int my_strcmp(const char* s1, const char* s2) {
    assert(s1 && s2);
    while (*s1 == *s2) {//相等往后++
        if (*s1 == '\0')return 0;
        s1++;
        s2++;
    }
    return *s1 - *s2;
}
int main() {
    char str1[] = "abx";
    char str2[] = "abcdef";
    int ret = my_strcmp(str1, str2);//>0,因为‘x’>'c'
    if (ret > 0)printf(">");
    else if (ret < 0)printf("<");
    else printf("=");
    return 0;
}

三 、长度受限制的字符串函数

  • strncpy函数

char * strncpy ( char * destination, const char * source, size_t num );//num表示传递的元素个数

strncpy为c语言库函数,能够实现从源字符串中拷贝num个元素到目标字符串中。

//举例    
    char str1[] = "wybxz!!!!!";
  //char str1[]="wx\0haha"
    char str2[20] = { 0 };
    strncpy(str2, str1, 6);
    printf("%s\n", str2);//wybxz!
  //printf("%s\n",str2);//wx

从上图调试中,我们可以看到strncpy在拷贝时,如果num小于字符串长度,并不会在拷贝num个字符后追加上‘\0’;

然而,如果源字符串的长度小于num或者在复制num个字符之前找到了源字符串的结尾(即‘\0’),则在拷贝完源字符串后,在后面追加\0,直到总共拷贝了num个元素。

模拟实现strmcpy函数:

char* my_strncpy(char* dest, const char* src, size_t n) {
    char* start = dest;
    while (n&&(*dest++ = *src++)){//wybxz10 9 8 7 6 5 4 3 2
        n--;
    }
    //字符串长度小于num
    if (n != 0) {
        while (--n) {
            *dest++ = '\0';
        }
    }
    return start;
}
int main() {
    char str1[] = "wybxz!!!";
    char str2[20] = "hahahahahah";
    //strncpy(str2, str1, 10);
    my_strncpy(str2, str1, 10);
    printf("%s\n", str2);
    return 0;
}
  • strncat函数

char* strncat(char* destination,const char* source,size_t num);

strncat函数是c语言库函数,能够实现将目标字符串后追加num个字符,目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到追加了num个字符。

注意:如果源字符串的长度小于num,则只复制到‘\0’的内容。

//举例
    char str1[] = "daytoy!!!";
    char str2[18] = "xz_";
    strncat(str2, str1, 6);
    printf("%s\n", str2);//xz_daytoy

模拟实现strncat函数:

char* my_strncat(char* dest,const char* src, size_t n) {
    char* cur = dest;
    while (*cur != '\0') {
        cur++;
    }
    while (n--) {
        if (*src != '\0')//目标字符串长度大于n或者未遇见'\0'
            *cur++ = *src++;
    }
    //以'\0'结束
    *cur = '\0';
    return dest;
}
int main()
{
    char str1[] = "daytoy!!!";
    char str2[18] = "xz_";
    //strncat(str2, str1, 6);
    my_strncat(str2, str1, 11);
    printf("%s\n", str2);
    return 0;
}

实现自己追加自己:

    char str1[18] = "sean";
    strncat(str1, str1, 4);
    printf("%s\n",str1);//seansean

注意:此时的num长度只能为源字符串元素个数,并且源字符数组的空间必须足够大。

  • strncmp函数

int strncmp ( const char * str1, const char * str2, size_t num );

strncmp是c语言库函数,用来比较两个字符串的大小直到出现另一个字符不一样或者一个字符串结束或者num个字符比较完。

int my_strncmp(const char* str1, const char* str2, size_t num) {
    char* s1 = str1;
    char* s2 = str2;
    while (num&&(*s1 == *s2)) {
        if (*s1 == '\0')return 0;//一个字符串结束
        s1++;
        s2++;
        num--;
    }
    if (num == 0)return 0;//前num个元素都相等
    return *s1 - *s2;//出现不相等字符
}
int main() {
    char str1[] = "happy";
    char str2[] = "habbit";
    //int ret=strncmp(str1, str2, 6);//>0
    int ret= my_strncmp(str1, str2, 6);//>0
    if(ret>0)printf(">");
    else if(ret==0) printf("=");
    else printf("<");
    return 0;
}

总结

以上就是针对部分字符串函数的模拟实现!!!祝大家顺顺利利健健康康,下次见!!!

标签: c++ 开发语言

本文转载自: https://blog.csdn.net/m0_71690645/article/details/126796846
版权归原作者 小曹Dayhappy. 所有, 如有侵权,请联系我们删除。

“模拟实现库函数之字符串函数”的评论:

还没有评论