C语言:自己实现字符串处理函数

之前一段时间在跑招聘的时候,经常有面试官让当场写字符串处理函数strcpy、strcat、strcmp、strchr等等

虽然实现起来比较简单,但是还是写此博客记录一下;

0000:strcpy

strcpy函数原型为:

char *strcpy(char* dest, const char *src);

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

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;

返回值:指向dest的指针;

<string.h>中的strcpy函数有一点需要注意,它会有一个内存越界的问题,当dest的空间不足以存放src中的字符串时,strcpy还是继续往后复制,直至将src中所有内容都复制过去,但是此时已经造成了内存越界,而且编译器不会报错,写程序测试;

#include<bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[])
{
    char str1[6] = "12345";
    char str2[20] = "9876543210abcdef";

    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    cout << endl << "after strcpy:" << endl << endl;
    
    strcpy(str1,str2);
    
    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    system("pause");
    return 0;
}

运行结果:

很明显发生了内存越界!

下面自己实现:

#include<bits/stdc++.h>

using namespace std;

char *mystrcpy (char *dest, const char *src)
{
    char *str = dest;
    if(src == NULL)
        return dest;

     while(*str != '\0' )
    {
        *(str++) = *(src++);
    } //[0]
   
    return dest;
}


int main(int argc, char const *argv[])
{
    char str1[6] = "12345";
    char str2[20] = "9876543210abcdef";

    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    cout << endl << "after strcpy:" << endl << endl;
    
    mystrcpy(str1,str2);
    
    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    system("pause");
    return 0;
}

[0]处的while内容换成while( (*str++ = *src++) != '\0');效果就与原版的strcpy相同;

运行结果:

 

0001:strcat

函数原型为:

char *strcat(char *dest, const char *src);

功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src,*src中原有的字符不变;

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;

返回值:返回指向dest的指针;

strcat存在与strcpy相同的内存越界问题,验证之:

#include<bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[])
{
    char str1[6] = "12345";
    char str2[20] = "9876543210abcdef";

    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    cout << endl << "after strcpy:" << endl << endl;
    
    strcat(str1,str2);
    
    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    system("pause");
    return 0;
}

运行结果:

直接强行将str2接在了str1的后面,此时已经内存越界了!

自己实现:

此时效果与原版的相同,如果想避免内存泄露问题,我想到的是将dest的空间长度参数传进去,作为限位控制数,如果你们有其他较好的想法,欢迎留言贴出来分享一下;

#include<bits/stdc++.h>

using namespace std;

char *mynewstrcat (char *dest, int size,const char *src)
{
    int cnt = 0;
    char *str = dest;
    if(src == NULL)
        return dest;
    while(*str != '\0')
    {
        str++;
        cnt++;
    }       
    while(*src != '\0' && cnt < size-1)
    {
        *(str++) = *(str2++);
        cnt++;
    }       
    *str = '\0';
    return dest;
}

int main(int argc, char const *argv[])
{
    char str1[6] = "12345";
    char str2[20] = "9876543210abcdef";
    char str3[10] = "54321";

    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    cout << "str3: " << str3  << endl;
    cout << endl << "after mynewstrcat:" << endl << endl;
    
    mynewstrcat(str1,6,str2);
    mynewstrcat(str3,10,str2);
    
    cout << "str1: " << str1  << endl;
    cout << "str2: " << str2  << endl;
    cout << "str3: " << str3  << endl;
    system("pause");
    return 0;
}

运行结果:

str1空间已满,所以没有连接新的字符;str3还剩4个字符空间,所以连接了4个字符;并没有造成内存越界;

 

0011:strcmp

明天再继续。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值