【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)

来源:互联网 发布:阴线买入指标公式源码 编辑:程序博客网 时间:2024/05/21 10:53
  1. strcpy

拷贝源字符串到子字符串,包括‘\0’。

代码实现:

char* strcpy(char* dst,const char* src){    assert(src);    char* ret = dst;    while (*src)    {        *dst = *src;        src++;        dst++;    }    *dst = '\0';    return ret;}



2.strncpy:

strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。

代码实现:

char* strncpy(char* dst, const char* src, int count){    assert(dst);    assert(src);    char* ret = dst;    while (count--)    {        *dst = *src;        dst++;        src++;    }    *dst = '\0';    return ret;}


3.strcat:

strcat作用是链接字符串,即:

str1: hel    str2:lo    则链接后为hello。

代码实现:

char* strcat(char* dst, char* src){    assert(dst);    assert(src);    char* ret = src;    while (*src)    {        src++;    }    while (*dst)    {        *src = *dst;        dst++;        src++;    }    *dst = '\0';    return ret;}


4.strcmp:

strcmp用来比较字符串长度。

对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。

代码实现:

int strcmp(const char* dst, const char* src){    assert(dst);    assert(src);    while (*src&&*dst)    {        if (*src == *dst)        {            src++;            dst++;        }        else        {            return *src - *dst - '\0';        }    }    return *src - *dst - '\0';}


5.strncmp:

与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。

但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。

代码实现:

int strncmp(const char* dst, const char* src,size_t count){    assert(dst);    assert(src);    while (count--&&*src&&*dst)    {        if (*src == *dst)        {            src++;            dst++;        }        else        {            return *src - *dst - '\0';        }    }    return *src - *dst - '\0';}


6.strstr:

寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。

代码实现:

char* strstr(const char* dst, const char* src){    assert(dst);    assert(src);    char* s1 = dst;    char* p = src;    char* s2 = p;    while (*s2)    {        s1 = dst;        s2 = p;        while (*s2 && *s1)        {            if (*s2 == *s1)            {                s1++;                s2++;            }            else            {                p++;                 break;            }        }        if (*s1 == '\0')        {            return p;        }    }    return NULL;}


7.memcpy:

strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。

代码实现:

void* memcpy(void* dst, const void* src, size_t count){    assert(dst);    assert(src);    char* dst_ = (char*)dst;    char* src_ = (char*)src;    while (count--)    {        *dst_++ = *src_++;    }    //即使此时count不为0,但是当我们将原数拷贝到新的数据结束,那也要结束程序。    *dst_ = '\0';//必须加上结束标志,否则会乱码    return dst;}


8.memmove:

memmove在于它可解决内存重叠问题。

如:将1,2,3,4,5,6,7,8中的1,2,3,4移动到3,4,5,6位置。那么则仍然按照memcpy则会,将1移动到3处,2移动到4处,再准备移动3时发现此时的3已经由于被移动到此处的1覆盖而丢失。4同理。这就是memmove的优势所在。我们分情况即可解决。

代码实现:

void memmove(void* dst, const void* src, size_t count){    assert(dst);    assert(src);    char* dst_ = (char*)dst;    char* src_ = (char*)src;    if (dst_ > src_&&dst < dst_ + count)    {        while (count--)        {            *(dst_+count) = *(src_+count);            dst_++;            src_++;        }    }    else    {        while (count--)        {            *dst_ = *src_;            dst_++;            src_++;        }    }    *dst_ = '\0';    return dst;}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1765040

0 0
原创粉丝点击