自己实现字符串的各个函数功能

在对字符串进行操作的时候,我们常常会用到字符串的相关函数,如strcmp(),strncmp(),strlen(),strcpy(),strncpy(),strcat(),strncat()函数,今天我就针对这些函数,进行使用讲解以及如何自己编写相应的程序来实现其功能。

字符串比较函数:strcmp()&&strncmp()

1.  int strcmp(const char *s1, const char *s2)

头文件:string.h

功能:比较字符串(区分大小写)

返回值:若字符串s1和字符串s2相同,则返回0;

      若字符串s1大于字符串s2,则返回正数;

              若字符串s1小于字符串s2,则返回负数。

注:是使用二进制的方式进行比较,而且字符串大小的比较是一ASCII码值进行比较的,首先s1和s2的第一个字符进行比较,若差值为0则继续比较,否则就讲差值返回。只可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
自己编写的实现strcmp()相同功能的函数my_strcmp():
<span style="font-size:18px;"><strong>#include <stdio.h>

int my_strcmp(const char * s1,const char * s2)
{

    while(*s1 != '\0')
    {
        if((*s1 - *s2) == 0)
        {
            s1 ++;
            s2 ++;
        }
        else
        { 
            if((*s1 - *s2) > 0)
            {
                return 1;
                break;
            }
            else
            {
                return -1;
                break;
            }
        } 
    }

    if(*s2 != '\0')
    {
        return -1;
    }

    return 0;
}

int main()
{
    int res;

    char *s1 = "hello";
    char *s2 = "hello";
   
    res = my_strcmp(s1,s2);

    switch(res)
    {
        case -1:
                printf("s1 < s2\n");
                break;
        case 0:
                printf("s1 = s2\n");
                break;
        case 1:
                printf("s1 > s2\n");
                break;
        default:
                printf("Error!");
    }

    return 0;
}</strong></span>
上面的函数调试结果为:
s1 = s2
这个程序主函数里进行比较的字符串是我自己设定的,大家也可以自己添加,从scanf录入。

                2. int strncmp(const char *s1, const char *s2, size_t n)

头文件:string.h

功能:比较指定比较数目前n个字符串(区分大小写)

返回值:若字符串s1和字符串s2前n个字符相同,则返回0;

             若字符串s1前n个字符大于字符串s2前n个字符,则返回数;

             若字符串s1前n个字符小于字符串s2前n个字符,则返回负数。

自己编写的实现strncmp()相同功能的函数my_strncmp():
<span style="font-size:18px;">#include <stdio.h>

int my_strncmp(const char * s1,const char * s2,size_t n)
{
    int i;

    for(i = 0;i < n;i ++)
    {
        if(*s1 == *s2)
        {
            s1 ++;
            s2 ++;
        }
        else
        {
            if(*s1 > *s2)
            {
                return 1;
                break;
            }
            else
            {
                return -1;
                break;
            }
        }
    }

    return 0;
}

int main()
{
    int res;
    int n = 2;

    char *s1 = "hi!";
    char *s2 = "hello world!";

    res = my_strncmp(s1,s2,n);

    switch(res)
    {
        case -1:
                printf("s1 < s2.\n");
                break;
        case 0:
                printf("s1 = s2.\n");
                break;
        case 1:
                printf("s1 > s2.\n");
                break;
        default:
                printf("Error!");
    }

    return 0;
}</span>
调试结果如下:
s1 > s2.

字符串拷贝函数:strcpy()&&strcncpy()

1.char *strcpy(char *dest,const char *src)

头文件:string.h

功能:把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间.

返回值:char * 类型,即指向dest的指针。

注:src和dest所指向的内存地址不可以重叠,且dest要有足够的空间来存放src的字符串。

自己编写函数my_strcpy()以实现跟strcpy()相同的函数功能:

#include <stdio.h>

char *my_strcpy(char *dest,char *src)
{
    char *temp = dest;

    while(*src != '\0')
    {
        *temp = *src;

        temp ++;
        src ++;
    }

    *temp = '\0';

    return dest;
}

int main()
{
    char dest[20] = "hello world!";
    char src[20] = "hi!";

    char *res = my_strcpy(dest,src);

    printf("The copied string is:%s\n",res);

    return 0;
}
调试结果为:

The copied string is:hi!

2.char *strncpy(char *dest, const char *src, size_t n)

头文件:string.h

功能:把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中

返回值:dest

自己编写程序my_strncpy()以实现与strncpy()相同的函数功能:

#include <stdio.h>

#define MAX_SIZE 1024

char * my_strncpy(char * dest,char * src,size_t n)
{
    int i;

    char *temp = dest;

    for(i = 0;i < n; i ++)
    {
        *temp = *src;

        temp ++;
        src ++;
    }

    return dest;
}

int main()
{
    int n = 3;

    char dest[MAX_SIZE] = "hi Nancy!";
    char src[MAX_SIZE] = "hello world!";

    char *res = my_strncpy(dest,src,n);

    printf("The copied string is:%s\n",dest);

    return 0;
}
调试结果为:
The copied string is:helNancy!

strcpy()和strncpy()的区别:

strcpy()只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出,而strncpy()则相对安全一点。

strncpy()能够选择一段字符输出,strcpy()不能。

字符串长度函数:strlen()
size_t strlen(const char *s)

头文件:string.h

      功能:计算字符串的长度

     返回值:字符串的长度

注:字符串长度不包括结束符'\0'。

自己编写my_strlen()函数以实现strlen()的相应的功能;
#include <stdio.h>

#define MAX_SIZE 1024

size_t my_strlen(const char *src)
{
    int len = 0;

    while(*src != '\0')
    {
        len ++;

        src ++;
    }

    return len;
}

int main()
{
    int len;

    char src[MAX_SIZE] = "hello world!";

    len = my_strlen(src);

    printf("The lenght of the string is:%d.\n",len);

    return 0;
}

调试结果为:
The lenght of the string is:12.

字符串连接函数:strcat() && strncat()

1.char *strcat(char *dest,const char *src)

头文件:string.h

                功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。

               返回值:连接后的字符串dest。

自己编写的my_strcat()函数以实现strcat()的功能:

#include <stdio.h>

#define MAX_SIZE 1024

char *my_strcat(char *dest,char *src)
{
    char *temp = dest;

    while(*temp != '\0')
    {
        temp ++;
    }

    while(*src != '\0')
    {
        *temp = *src;

        temp ++;
        src ++;
    }

    return dest;
}

int main()
{
    char dest[MAX_SIZE] = "hello world!";
    char src[MAX_SIZE] = "hi!";

    char *res = my_strcat(dest,src);

    printf("The linked string is:%s\n",dest);

    return 0;
}

调试结果为:
The linked string is:hello world!hi!

2.char *strncat(char *dest,const char *src,size_t n)

头文件:string.h

        功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0'),再追加'\0'。

        返回值:指向dest的指针。

自己编写的my_strncat()函数以实现strncat()的功能:

#include <stdio.h>

#define MAX_SIZE 1024

char * my_strncat(char *dest,char *src,size_t n)
{
    int i;

    char *temp = dest;

    while(*temp != '\0')
    {
        temp ++;
    }

    for(i = 0;i < n;i ++)
    {
        *temp = *src;

        temp ++;
        src ++;
    }

    *temp = '\0';

    return dest;
}

int main()
{
    int n = 4;

    char dest[MAX_SIZE] = "hello world!";
    char src[MAX_SIZE] = "hi Nancy!";

    char *res = my_strncat(dest,src,n);

    printf("The linked string is:%s\n",dest);

    return 0;
}


调试结果为:

The linked string is:hello world!hi N










                                   

        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值