C语言常用字符串操作函数strcpy、strcat、strcmp、strlen、strchr、strstr的实现

strcpy

函数原型:char *strcpy(char *dest, const char *src);

功能:拷贝字符串src到目标字符串dest

实现方法:

char *strcpy(char* dest, const char* src)
{
        //assert(dest!=NULL&&src!=NULL);//空值处理<asser.h>
        char *addr = dest;
        while(*dest++ = *src++);
        return addr;
}

strncpy

函数原型:char *strncpy(char *dest, const char *src, size_t n);

功能:拷贝字符串src前n个字节到目标字符串dest

实现方法

char *strncpy(char *dest, const char *src, size_t n)
{
        size_t i;

        for (i = 0; i < n && src[i] != '\0'; i++)
                dest[i] = src[i];
        for ( ; i < n; i++)
                dest[i] = '\0';

        return dest;
}

strcat

函数原型:char *strcat(char *dest, const char *src);

功能:连接字符串,将字符串src连接在dest之后

实现方法:

char *strcat(char *dest, const char *src)
{
        char* temp = dest;

        while(*dest)
                dest++;
        while(*src)
                *dest++ = *src++;
        *dest = '\0';

        return temp;
}

strncat

函数原型:char *strncat(char *dest, const char *src, size_t n);

功能:连接字符串,将字符串src前n个字节连接在dest之后

实现方法:

char *strncat(char *dest, const char *src, size_t n)
{
        size_t dest_len = strlen(dest);
        size_t i;

        for (i = 0 ; i < n && src[i] != '\0' ; i++)
                dest[dest_len + i] = src[i];
        dest[dest_len + i] = '\0';

        return dest;
}

strcmp

函数原型:int strcmp(const char *str1, const char *str2);

功能:比较两个字符串

当str1指向的字符串大于str2指向的字符串时,返回正数。

当str1指向的字符串等于str2指向的字符串时,返回0。

当str1指向的字符串小于str2指向的字符串时,返回负数。

实现方法:

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

strncmp

函数原型:int strncmp(const char *s1, const char *s2, size_t n);

功能:比较两个字符串前n个字符

当str1指向的字符串大于str2指向的字符串时,返回正数。

当str1指向的字符串等于str2指向的字符串时,返回0。

当str1指向的字符串小于str2指向的字符串时,返回负数。

实现方法:

int strncmp(const char *s1, const char *s2, size_t n)
{
        if(!n)
                return 0;
        while(--n && *s1 && *s1 == *s2){
                s1++;
                s2++;
        }
        return *s1 - *s2;
}

strlen

函数原型:size_t strlen(const char *s);

功能:返回字符串s的长度,不包括 '\0'

实现方法:

size_t strlen(const char* s)
{
        int len = 0;
        while(*s != '\0'){
                s++;
                len++;
        }
        return len;
}

strchr

函数原型:char *strchr(const char *s, int c);  //第二个参数为int型,调用时可以是char型

功能:返回字符c第一次在字符串s中出现的位置,如果无返回NULL

实现方法:

char *strchr(const char *s, int c)
{
    for (; *s != (char)c; ++s)
        if (*s == '\0')
            return NULL;
    return (char *)s;
}

strrchr

函数原型: char *strrchr(char *s, char c)

功能:返回字符c最后一次在字符串s中出现的位置,如果无返回NULL

实现方法:

char *strrchr(const char *s, int c)
{
       const char *p = s + strlen(s);
       do {
           if (*p == (char)c)
               return (char *)p;
       } while (--p >= s);
       return NULL;
}

strstr

函数原型:char *strstr(const char *s1, const char *s2);

功能:查找s2在s1中出现的位置,如果没有,返回NULL

实现方法:

char *strstr(const char *s1, const char *s2)
{
    size_t l1, l2;

    l2 = strlen(s2);
    if (!l2)
        return (char *)s1;
    l1 = strlen(s1);
    while (l1 >= l2) {
        l1--;
        if (!memcmp(s1, s2, l2))
            return (char *)s1;
        s1++;
    }
    return NULL;
}




发布了2 篇原创文章 · 获赞 0 · 访问量 728
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览