字符串操作函数的实现方法(代码)

说明

字符串操作函数在C语言中的使用是相当多的,也难怪标准库函数有定义实现,也是一个很明智的选择,帮助我们简化了对字符串的操作。
其实我们也可以尝试写一下这些常用函数的具体实现方法,也可以帮助我们对这些函数有更深的理解,之后使用时也会更加自如。


查看函数的使用手册

要实现一个函数,当然先需要知道它的作用是什么,相信大多数人都会摆渡,基本也都能解决问题。Linux环境下,其实我们可以用man命令查看函数的使用说明,有很详细的讲解,包括函数的声明、使用描述、返回值等,只不过是英文的,但是可以尝试查看,相信以后会有帮助。
具体的使用我就不写了,直接写实现代码,不一定十分严密,也应该不是最简洁高效的,但基本没大问题,经供参考。

注意:
1、函数开头的输入错误的判断我写的不严密,不要照着使用。我觉得有些可以打印提示后,直接用assert退出。
2、个人觉得大多数都是不难的,最难的可能就是strtok函数了,一定要先理解它的使用方法。


字符串操作函数

1、strlen
#define ERR_INPUT -2

int strlen(const char *str)
{
    if(!str)
    {
        printf("INPUT ERROR!\n");
        return ERR_INPUT;              
    }

    int len = 0;
    while(str[len] != '\0')
    {
        len++;
    }
    return len;
}

2、strcat
char *strcat(char *dest, const char *src)
{
    if(!dest || !src)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    int len = strlen(dest);
    int i = 0;
    while(src[i] != '\0')
    {
        dest[len + i] = src[i];
        i++;
    }
    dest[len + i] = '\0';
    return dest;
}

3、strcmp
int strcmp(const char *str1, const char *str2)
{
    if(!str1 || !str2)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    int len = strlen(str1);
    int len2 = strlen(str2);
    if(len2 < len)
        len = len2;
    int i = 0;
    int check = 0;
    for(i = 0; i <= len; i++)
    {
        if(str1[i] > str2[i])
        {
            check = 1;
            break;
        }
        else if(str1[i] < str2[i])
        {
            check = -1;
            break;
        }
    }
    return check;
}

4、strncmp
int strncmp(const char *str1, const char *str2, int n)
{
    if(!str1 || !str2 || n < 1)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    int i = 0;
    int check = 0;
    for(i = 0; i < n; i++)
    {
        if(str1[i] > str2[i])
        {
            check = 1;
            break;
        }
        else if(str1[i] < str2[2])
        {
            check = -1;
            break;
        }
    }
    return check;
}

5、strcasecmp
int strcasecmp(const char *str1, const char *str2)
{
    if(!str1 || !str2)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    char p1, p2;
    int len = strlen(str1);
    int len2 = strlen(str2);
    if(len2 < len)
        len = len2;
    int i = 0;
    int check = 0;
    for(i = 0; i <= len; i++)
    {
        p1 = str1[i];
        p2 = str2[i];
        if(str1[i] >= 'A' && str1[i] <= 'Z')
            p1 = str1[i] + 32;
        if(str2[i] >= 'A' && str2[i] <= 'Z')
            p2 = str2[i] + 32;

        if(p1 > p2)
        {
            check = 1;
            break;
        }
        else if(p1 < p2)
        {
            check = -1;
            break;
        }
    }
    return check;
}

6、strchr
char *strchr(const char *str, int n)
{
    if(!str || n < 0 || n > 127)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    char *p = NULL;
    int i = 0;
    while(str[i] != '\0')
    {
        if(str[i] == n)
        {
            p = (char *)str + i;
            break;
        }
        i++;
    }
    return p;
}

7、strtok
char *strtok(char *str, const char *s)
{
    if(!str || !s)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    static char *last = NULL;
    static int p = 0;
    static int a[100] = {0};
    if(str == NULL && last == NULL)
        return ;

    if(last != NULL)
    {
        p++;
        last = last + a[p] - a[p - 1];
        return (last + 1);
    }

    int lenstr = strlen(str);
    int lens = strlen(s);

    int m = 0;
    int n = 0;
    int i = 0;
    for(m = 0; m < lenstr; m++)
    {
        for(n = 0; n < lens; n++)
        {
            if(str[m] == s[n])
            {
                str[m] = '\0';
                a[i] = m;
                i++;
                m++;
                break;
            }
        }
    }
    last = str;
    return last;
}

8、strcpy
char *strcpy(char *dest, const char *src)
{
    if(!dest || !src)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    int i = 0;
    while(src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return dest;
}

9、strncpy
char *strncpy(char *dest, const char *src, int n)
{
    if(!dest || !src || n < 1)
    {
        printf("INPUT ERROR!\n");
        return NULL;           
    }

    int i = 0;
    while(src[i] != '\0' && i < n)
    {
        dest[i] = src[i];
        i++;
    }
    while(i < n)
    {
        dest[i] = '\0';
        i++;
    }
    return dest;
}

10、strstr
char *strstr(const char *haystack, const char *needle)
{
    if(!haystack || !needle)
    {
        printf("INPUT ERROR!\n");
        return NULL;        
    }

    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    int len = len1 - len2 + 1;

    int i = 0;
    int t = 0;
    char *p = NULL;
    int flag = 1;
    for(i = 0; i < len; i++)
    {
        flag = 1;
        for(t = i; t < len2 + i; t++)
        {
            if(haystack[t] != needle[t - i])
            {
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            p = (char *)haystack + i;
            break;
        }
    }
    return p;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值