字符函数和字符串函数1

字符函数分类

字符串长度受限制

求字符串长度--->strlen

字符串以“\0”为结束标志,strlen统计"\0"以前的字符串个数,该函数的返回值是size_t类型的。

模拟strlen函数:

方法一:

#include<assert.h>
size_t my_strlen(const char* dest)
{
    int count = 0;
    assert(dest != NULL);
    while (*dest != '\0')
    {
        count++;
        dest++;
    }
    return count;
}
int main()
{
    char arr1[] = "abcdef";
    int ret = my_strlen(arr1);
    printf("%d", ret);
    return 0;
}

方法二:指针减指针

size_t my_strlen(const char * dest)
{
    const char* start = dest;
    assert(dest != NULL);
    while (*(++dest))
    {
        ;
    }
    return dest - start;
}
int main()
{
    char arr1[] = "abcdef";
    int ret = my_strlen(arr1);
    printf("%d", ret);
    return 0;
}

方法三:递归

size_t my_strlen(const char* dest)
{
    assert(dest != NULL);
    if (*dest != '\0')
    {
        return 1 + my_strlen(dest + 1);
    }
    else
        return 0;
}
int main()
{
    char arr1[] = "abcdef";
    int ret = my_strlen(arr1);
    printf("%d", ret);
    return 0;
}

注意:size_t返回的一直是个正数,如果2个字符串长度相减,前者大于后者,那么在无符号数的计算中负数只能当成正数处理,会是一个很大的正数。

例:

#include<string.h>
int main()
{
    int ret = strlen("abc") - strlen("abcd");
    return 0;

}

字符串的拷贝---->strcpy

char*strcpy(char*strDestination,constchar*strSource);

  1. 源字符必须以\0结束

  1. 会将源字符的\0拷贝到目标空间

  1. 目标空间必须足够大

  1. 目标空间必须可见

strcpy模拟:

char* my_strcpy( char* str,const char* dest)
{
    char* start = str;
    assert(str && dest);
    while (*dest!='\0')
    {
        *str = *dest;
        str++;
        dest++;
    }
    return start;
}
int main()
{
    char arr1[30] = "xxxxxx";
    char arr2[] = "abcd";
    my_strcpy(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

字符串追加---->strcat

char*strcat(char*strDestination,constchar*strSource);

  1. 源字符串必须以\0结束

  1. 目标空间足够大

  1. 目标空间必须可修改

strcat的模拟:

char* my_strcat(char* str,const char* dest)
{
    char* start = str;
    assert(str && dest);
    while (str != '\0')
    {
        str++;
    }
    while (*str++=*dest++)
    {
        ;
    }
    return start;
}
int main()
{
    char arr1[30] = "xxxx";
    char arr2[] = "abcd";
    my_strcat(arr1, arr2);
    printf("%s", arr1);
    return 0;
}

字符串的比较---->strcmp

intstrcmp(constchar*string1, constchar*string2);

第一个字符串大于第二个字符串返回大于0的数字

第一个字符串小于第二个字符串返回小于0的数字

第一个字符串等于第二个字符串返回等于0的数字

strcmp的模拟:

int my_strcmp(char* str, char* dest)
{
    assert(str && dest);
    while (*str == *dest)
    {
        if (*dest == "\0")
        {
            return 0;
        }
        str++;
        dest++;
    }
    if (*str > *dest)
        return 1;
    else if (*str < *dest)
        return -1;
}
int main()
{
    char arr1[] = "abcd";
    char arr2[] = "abcde";
    int ret = my_strcmp(arr1, arr2);
    return 0;
}

字符串长度受限制

strncpy

char*strncpy(char*strDest,constchar*strSource,size_tcount);

int main()
{
    char arr1[10] = "XXXXXXX";
    char arr2[] = "abcdef";
    strncpy(arr1, arr2, 3);
    printf("%s", arr1);
    return 0;
}

拷贝前3个字符

strncat

char*strncat(char*strDest,constchar*strSource,size_tcount);

#include<string.h>
int main()
{
    char arr1[15] = "XXXXXXX";
    char arr2[] = "abcdef";
    strncat(arr1, arr2, 3);
    printf("%s", arr1);
    return 0;
}

strncmp

int main()
{
    char arr1[15] = "abcdefg";
    char arr2[] = "abcdef";
    int ret =strncmp(arr1, arr2, 3);
    printf("%d", ret);
    
    return 0;
}

字符串的查找----->strstr

char*strstr(constchar*string,constchar*strCharSet);

到一个字符串中查找另一个字符串,如果查到返回地址,查不到返回空指针。 .

strstr的使用:

#include<string.h>
int main()
{
    char arr1[15] = "abcdefg";
    char arr2[] = "cdef";
    char* ret=strstr(arr1, arr2);
    printf("%s", ret);
    
    return 0;
}

strstr的模拟实现:

char* my_strstr(const char* str1, const char* str2)
{
    assert(str1 && str2);
    if (*str1 == '\0')
    {
        return (char*)str1;
    }
    const char* s1 = str1;
    const char* s2 = str2;
    const char* cp = str1;
    while (*cp)
    {
        s1 = cp;
        s2 = str2;
        while (*s1 == *s2&&*s1!='\0'&&*s2!='\0')
        {
            s1++;
            s2++;
        }
        if (*s2 != '\0')
        {
            return (char*)cp;
        }
        cp++;
    }
    return NULL;
}
int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "bc";
    char* ret = my_strstr(arr1, arr2);
    printf("%s", ret);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值