字符串函数

大家在学习C语言的过程中一定离不开字符串的使用,今天给大家分享一些有关字符串的函数,我们知道 ,我们在使用字符串函数时需要引用头文件string.h,今天我们在不使用该头文件的情况下来自行编写常用的字符串函数。
我们知道,strlen()是用来求字符串长度的函数,而strcpy()是复制字符串的函数,下面我们来编写这两个函数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>
int my_strlen(char* msg)
{
    char *p = msg;
    while (*p!='\0')
    {
        p++;
    }
    return p - msg;
}

char* my_strcpy(char *des, char *src)
{
    assert(des != NULL);
    assert(src != NULL);
    char *p = des;
    while (*des++=*src++)
    {
        ;
    }
    return p;
}

int main()
{
    char* msg = "abcdef";
    char des[6] = "hello";
    char* src = "world";
    int n = my_strlen(msg);
    char *ret = my_strcpy(des, src);
    printf("%d\n", n);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

在上述程序中我们分别把这两个函数定义为my_strlen(),和my_strcpy。
我们定义一个指针,是它指向字符串的第一个字符,然后将指针加一,直到遇到\0时停下,返回的是p-msg,两个指针相减意为两指针所指向类型之间的元素个数(两个指针指向同一字符串),所以返回的值就是字符串的长度。
第二个函数,首先重新定义一个指针p使其指向被复制的字符串,将src复制给des然后在将两指针分别加一使其指向下一个元素,直到遇到\0。最后返回的p就是复制之后的字符串。
运行结果:
这里写图片描述

我们再来写几个函数:strcat()连接两个字符串,strstr()求子字符串,strcmp()比较两个字符串的大小。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>
char* my_strcat(char *des,const char *src)
{
    assert(des != NULL);
    assert(src != NULL);
    char *p = des;
    while (*des)
    {
        des++;
    }
    while (*des++ = *src++)
    {
        ;
    }
    return p;
}
char* my_strstr(char *des,  char *src)
{
    assert(des != NULL);
    assert(src != NULL);
    char *p = des;
    char *q = src;
    char *m = NULL;
    while (*p)
    {
        m = p;
        q = src;
        if (*p == *q)
        {
            while (*p==*q&&*p&&*q)
            {
                p++;
                q++;
            }
            if (*q == '\0')
            {
                return m;
            }
            p = m;
            q = src;
        }
        p++;
    }
    return NULL;
}
int my_strcmp(const char * src, const char * dst)
{
    int ret = 0;

    while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        ++src, ++dst;

    if (ret < 0)
        ret = -1;
    else if (ret > 0) 
        ret = 1;

    return(ret);
}
int main()
{
    char des[] = "hello";
    char *src = "world";
    char *str1 = "123abcabcdexyz";
    char *str2 = "abcde";
    char *p = "hello";
    char *q = "hello";
    char *ret1 = my_strcat(des,src);
    char *ret2 = my_strstr(str1, str2);
    int ret3 = my_strcmp(p, q);
    printf("%s\n", ret1);
    printf("%s\n", ret2);
    printf("%d\n", ret3);
    system("pause");
    return 0;
}

首先我们看第一个函数,将指针des指向指向该字符串的最后一个元素\0,然后在对其进行复制,将字符串src复制给它,然后两指针分别加一,使其指向下一地址,直到src指向\0,完成两个字符串的连接。
我们再来看第二个函数,我定义了两个字符串“123abcabcdexyz”和“abcde”首先我们定义两个指针p,q分别指向两个字符串的第一个元素,然后我们来比较两个元素是否相等,若不相等则使p加一直到找到与q所指向的字符相等的字符。此时p指向第一个a,q指向a,相等,我们在定义一个指针m来记录这个位置,当我们开始比较,相等则p和q分别加一,若不相等则p返回记录的位置m,q返回到第一个元素的位置,当q指向\0时,说明存在子字符串,此时返回子字符串起始的位置,输出结果即为abcdexyz。
接下来看第三个函数,比较两个字符串的大小。分别比较每个字符的ASCII码值,定义一个整型变量ret,使ret等于两个元素相减的差,若ret=0则返回0,若大于0则返回1,若小于0则返回-1。
运行结果如下:
这里写图片描述
以上就是对部分字符串函数的自定义编写,欢迎大家一起交流讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值