memcpy(),strcpy(),strcat()的正确写法

在网上翻阅一些博客,感觉其中很多文章的代码都不能通过编译和正确运行,同时很多面试类书籍上的代码也是有问题的。

下面给出三个函数的代码实现,保证了健壮性,给出了注释,并做了测试通过。

memcpy()

/******************************************
@健壮的内存拷贝函数以及测试
@xiaolewen_bupt
@ 2016-4-3
*******************************************/

#include <iostream>
#include <stdlib.h>
#include <assert.h>

using namespace std;

void* memcpy_(void* dst,const void* src,int count)    //还是那句话,在传入变量时用const
{
    assert(dst!=NULL && src!=NULL);   //首先不能传入空指针

    unsigned char* dst_tmp = (unsigned char *)dst;   //这句很重要,首先做一次类型强转,因为void* 类型的指针无法进行算数运算
    unsigned char* src_tmp = (unsigned char *)src;   //编译器直接报错:error: arithmetic on a pointer to void

    assert(!(dst_tmp<=src_tmp && dst_tmp+count>src_tmp));   //地址不能有重叠,分两种情况进行考虑
    assert(!(dst_tmp>=src_tmp && src_tmp+count>dst_tmp));   

    while(count--)
    {
        *dst_tmp = *src_tmp;
        dst_tmp++;
        src_tmp++;
    }
    return dst;
}
typedef struct A
{
    int a;
    char b;
}A;

int main(int argc, char const *argv[])
{
    A instance_of_A;
    instance_of_A.a=0;
    instance_of_A.b='h';
    A* ptr1=&instance_of_A;

    A* ptr2=(A*)malloc(sizeof(A));

    memcpy_(ptr2,ptr1,sizeof(A));

    cout<<ptr2->a<<endl;
    cout<<ptr1->b<<endl;



    return 0;
}

strcpy()

#include <iostream>
using namespace std;
#include <assert.h>

char *strcpy_(char *dst,const char *src)
{
    assert(dst!=NULL && src!=NULL);

    char *dst_tmp=dst;
    while((*dst++ = *src++)!='\0');
    return dst_tmp;

}


int main(int argc, char const *argv[])
{
    char a[10];
    const char *b="abcde";
    strcpy_(a,b);
    cout<<a<<endl;
    return 0;
}

strcat()

#include <iostream>
using namespace std;
#include <assert.h>


char* strcat_(char *dst,const char *src)
{
    assert(dst!=NULL & src!=NULL);
    char *dst_tmp=dst;
    while(*dst!='\0')
        dst++;    //指针++是根据实际指向的类型长度++的
    while((*dst++ = *src++) != '\0');
    *dst='\0';
    return dst_tmp;
}


int main(int argc, char const *argv[])
{
    char a[10]="abcde";
    const char *b="fgh";
    strcat_(a,b);
    cout<<a<<endl;
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值