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

原创 2016年05月30日 17:18:40
  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

c函数strcpy() ,strcat(),strcmp(), strlen(), strchr() ,strstr() 使用整理

1.strcpy() 功能:      字符串复制 头文件:   string.h 返回值类型:   char* C语言标准库函数strcpy,把从src地址开始且含有'\0'结...
  • bitlxlx
  • bitlxlx
  • 2016年07月26日 10:33
  • 1248

不调用库函数,实现strcpy函数;编程实现memcpy函数

已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc); 要求如下。(1)不调用库函数,实现strcpy函数;(2)解释为什么...
  • newnewman80
  • newnewman80
  • 2011年04月14日 16:49
  • 2872

strcat,strcpy,strcmp,strstr,memset,memcpy,strsep在内核中的实现

以下代码来自linux-2.6.38 1、strcat 在lib/string.c中实现。 1 /** 2 * strcat - Append one %NUL-term...
  • qiao_yihan
  • qiao_yihan
  • 2013年12月23日 09:42
  • 2037

C语言_编写说明strlen、strcpy、strcat、strcmp如何实现的

随便定义一个char类型字符串数组,此以char string[] = "iphone";为例。 实现strlen char string[] = "iphone";     int...
  • xiu619544553
  • xiu619544553
  • 2015年04月25日 15:57
  • 397

【C语言】模拟实现strcpy、strcat、strcmp函数

strcpy、strcat、strcmp这三个库函数是初级学习阶段经常写到的三个库函数,也是一些大公司比较喜欢出的面试题。今天,就尝试用my_strcpy、my_strcat、my_strcmp这三个...
  • Monster_Girl
  • Monster_Girl
  • 2016年07月31日 19:06
  • 2381

模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

C语言库函数实现练习1.模拟实现strcpystrcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。 注意:在进...
  • aimee_1024
  • aimee_1024
  • 2017年12月18日 22:46
  • 46

模拟实现strcmp,strncmp,strstr,strcat,strncat,strcpy,strncpy,strlen ,memcpy,memmove等函数

1.模拟实现strlen函数 #include #include #include int my_strlen(const char *str)//循环 { int count  = 0; asser...
  • qq_35420908
  • qq_35420908
  • 2016年08月03日 22:08
  • 539

C语言库函数strcpy与memcpy函数比较

C语言中strcpy与memcpy函数是怎么实现的又有哪些区别呢?   我们先来看下字符串的存储,字符串一般是用字符数组的方式存储,问题来了,我们都知道字符串有一个结束符"\0",存储字符串的字符数组...
  • changyourmind
  • changyourmind
  • 2016年07月21日 14:54
  • 1098

模拟实现c库函数strcpy,strcat,strstr,strcmp,memcpy,memmove

目录 strcpy strcat strstr strcmp memcpy memmove strcpy strcpy是字符串复制函数,把从src(源字符串指针)地址...
  • Important_
  • Important_
  • 2018年01月30日 15:53
  • 16

C语言字符串操作----strlen()、strcpy()、strcat()、strcmp()

C语言中并没有没有显示的字符串数据类型,因此字符串以字符串常量的形式或者存储于字符数组中。字符串常量很适合用于那些程序不会对它们进行修改的字符串,所有其他字符串必须存储于字符数组或动态分配的内存中。注...
  • haofight
  • haofight
  • 2016年12月24日 19:25
  • 752
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
举报原因:
原因补充:

(最多只允许输入30个字)