Bscis Knowledge(Function)

本文详细介绍了几个常用的字符串操作函数,包括计算字符串长度的strlen、内存填充函数memset、内存拷贝函数memcpy与memmove以及字符串查找函数strstr。这些函数在C/C++编程中极为常见,通过本文你可以了解到它们的具体实现原理及应用场景。
extern unsigned int strlen(char *s)

计算字符串s的(unsigned int)长度,不包括(‘\0’)

int strlen(const char *str)
{
    assert(str!=nullptr);
    int len=0;
    while((*str++) != '\0') len++;
    return len;
}

void *memest(void *s, int ch, size_t count)

将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s .作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

void *memest(void *src, int ch, size_t count)
{
    assert(str!=nullptr);
    char *tmpsrc = (char*)src;
    while(count--) *tmpsrc++ = (char)ch;
    return src;
}

void *memcpy(void *dst, const void *src, size_t n)

从源src所指的内存地址其实位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

void *memcpy(void *dst, const void *src, size_t num)
{
    assert((dst!=nullptr) && (scr!=nullptr));
    assert(des >= scr+num || scr > dst+num);//内存重叠
    byte *psrc = (byte*)src;//byte即为unsigned char类型
    byte *pdst = (byte*)dst;
    while(num-- > 0) *pdst++ = *psrc++;//先取值,再指向下一位
    return dst;
}

void memmove(void dest, const void* src, size_t count)

memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同

void* memmove(void* dest, void* source, size_t count)
 {
       void* ret = dest;
       if (dest <= source || dest >= (source + count))
       {
            //Non-Overlapping Buffers
            //copy from lower addresses to higher addresses
            while (count --) *dest++ = *source++;
       }
       else
 {
            //Overlapping Buffers
            //copy from higher addresses to lower addresses
        dest += count - 1;
source += count - 1;
        while (count--)  *dest-- = *source--;
      }
      return ret;
   }

char *strstr(char *str1, const char *str2)

str1: 被查找目标 string expression to search.
str2: 要查找对象 The string expression to find.
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

char str[]="1234xyz";
char *str1=strstr(str,"34");
cout << str1 << endl; //34xyz
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值