C语言常用字符函数

仅供复习整理

一、strlen

size_t strlen(const char* str);

strlen函数是用来计算字符串中从头到'\0'之间有多少个字符(因为字符串是以'\0'结尾的)

模拟实现:

#include <stdio.h>
#include <assert.h>

size_t my_strlen(const char* str)
{
    //因为下面直接解引用了,所以得判空
    assert(str);
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

二、strcpy

char* strcpy(char* destination, const char* sour)
将sour的数据拷贝到destination,包括'\0'
返回的是destination的首地址

模拟实现:

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* destination, const char* sour)
{
    assert(destination && sour);
    char* ret = destination;
    while (*destination++ = *sour++)
    {
        ;
    }
    return ret;
}

三、strcat

char * strcat ( char * dest, const char * sour );
将sour中的字符串复制并追加到dest中'\0'开始的位置。

模拟实现:

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* sour)
{
    char* res = dest;
    assert(dest && sour);
    //先找\0
    while (*dest)
    {
        dest++;
    }

    while (*dest++ = *sour++)
    {
        ;
    }
    return res;
}

四、strcmp

int strcmp ( const char * str1, const char * str2 );
用来比较两个字符串是否相等。
*str1 > *str2 返回 >0
*str1 < *str2 返回 <0
如果两个字符相等则返回0

模拟实现:

#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

五、strstr

cosnt char *  strstr (const char * str1, const char * str2);
用来判断str2是否在str1中出现过。
返回第一出现的位置。

模拟实现:

#include <stdio.h>
#include <assert.h>

char* my_strstr(const char* s1, const char* s2)
{
    assert(s1 && s2);
    int i = 0;
    int j = 0;
    while (s1[i] && s2[j])
    {
        if (s1[i] == s2[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (s2[j] == '\0')
        return s1 + i - j;
    if (s1[i] == '\0')
        return NULL;
}

六、memcpy

void * memcpy ( void * destination, const void * source, size_t num );
将source的num个字节拷贝到destination
注意!当两块内存空间重叠时,由于编译器,结果不能确定。此时可以使用memove

模拟实现:

#include <stdio.h>
#include <assert.h>

void* my_memcopy(void* dest, const void* sour, size_t num)
{
    assert(dest && sour);
    void* ret = dest;
    while (num--)
    {
        //由于这里不考虑重叠情况,所以默认是不重叠
        *(char*)dest = *(char*)sour;
        dest = (char*)dest + 1;
        sour = (char*)sour + 1;
    }
    return ret;
}

七、memmove

void * memmove ( void * destination, const void * source, size_t num );
功能与memcpy相似,带能处理内存重叠的情况,相当于升级版的memcpy.

模拟实现:

需要注意:内存重叠有两种情况!

void* my_memmove(void* dest, const void* sour, size_t num)
{
    assert(dest && sour);
    void* ret = dest;
    if (dest > sour)
    {
        while (num--)
        {
            *(char*)dest = *(char*)sour;
            dest = (char*)dest + 1;
            sour = (char*)sour + 1;
        }
    }
    else
    {
        while (num--)
        {
            *((char*)dest + num) = *((char*)sour + num);
        }
    }
    return ret;
}

如有错误,欢迎指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值