当前位置:首页 » 《随便一记》 » 正文

教你成为比卡卡西还牛逼的全能忍者,全拷贝与分割函数

21 人参与  2023年04月05日 17:23  分类 : 《随便一记》  评论

点击全文阅读


 如何成为一个集雷切,写轮眼侦查和拷贝与一身的卡卡西,下面教你!

目录

 第一式——雷切! 

strtok

第二式——写轮眼侦查!

strerror函数

第三式——写轮眼拷贝!

memcpy

 模拟实现memcpy函数


 ?博客昵称:陈大大陈

?座右铭:所谓觉悟,就是在漆黑的荒野上开辟出一条理当前进的光明大道。

?博主简介:一名热爱C/C++和算法等技术,喜欢运动,爱胡思乱想却胸怀大志的小博主!

?博主&唠嗑:早午晚哈喽Ciao!?各位CSDN的朋友!?我是博客新人陈大大陈,希望我的文章能为你带来帮助!欢迎大家在评论区畅所欲言!也希望大家多多为我提出您宝贵的建议!?如果觉得我写的不错的话还请点个赞和关注哦~???

 

 第一式——雷切! 

strtok

char * strtok ( char * str, const char * delimiters ) 

这其中,delimiters参数是一个字符串,定义了用作分隔符的参数集合 。而str参数指定一个目标字符串,这个字符串中包含0个或者多个由delimiters中的分隔符分割的标记。strtok函数的功能是找到下一个标记,并将其用\0结尾,返回一个指向该标记的指针。需要注意的是,strtok函数会改变被操作的目标字符串,所以我们再用该函数进行分割操作时,一般都是使用字符串的临时拷贝。strtok函数的第一个参数不为NULL时,函数将找到str中的第一个标记,函数将它保存在字符串当中的位置。strtok的第一个参数为NULL,函数将在同一个字符串被保存的位置开始,寻找下一个标记位置。如果字符串中没有标记位置,或者标记位置已经被查找完成,函数返回一个NULL指针。

代码示范:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main(){    char str[] = "- This, a sample string.";    char* pch;    printf("Splitting string \"%s\" into tokens:\n", str);    pch = strtok(str, " ,.-");    while (pch != NULL)    {        printf("%s\n", pch);        pch = strtok(NULL, " ,.-");    }    return 0;}

如图所示,我们定义了空格,逗号,句号和减号四个分隔符来将字符串分割,当函数返回值不为空指针时,我们持续调用函数。

运行结果如下:

 除此之外,还有一个极为巧妙的的写法

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main(){    char str[] = "- This, a sample string.";    char* pch;    printf("Splitting string \"%s\" into tokens:\n", str);       for ( pch = strtok(str, " ,.-");pch != NULL; pch = strtok(NULL, " ,.-"))    {        printf("%s\n", pch);           }    return 0;}

没错!用for循环也是可以滴!就像是卡卡西的千鸟和雷切,不管用哪个都能把带土切开!

第二式——写轮眼侦查!

卡卡西具有出色的侦查能力,可以发现任何风吹草动,我们也有模拟实现这一功能的函数。

strerror函数

char * strerror ( int errnum );

函数会返回错误码所对应的错误信息,返回值是一个指向描述错误的字符串的指针。

要使用它的话,必须包含errno.h这个头文件。

#include <stdio.h>#include <string.h>int main(){    char* p = strerror(0);    printf("%s\n", p);        p=strerror(1);        printf("%s\n", p);        p = strerror(2);        printf("%s\n", p);        p = strerror(3);        printf("%s\n", p);    return 0;}
每一个这样的错误码都对应着一个错误信息,sterror函数能把错误码所对应错误信息的首字符的地址返回。当C语言的库函数调用失败的时候,会将一个错误码存放在一个叫errno的变量中。当我们想知道调用库函数的时候发生了什么错误信息,就可以将errno中的错误码翻译成错误信息。

看下面的例子:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main(){    FILE* pf = fopen("test.txt", "r");//打开文件函数,r代表只读;//如果该文件不存在话,就会打开失败,失败的话,pf里面存的就是NULL空指针,就会把错误码放在变量errno里面;    if (pf == NULL)    {        printf("打开文件失败,原因是:%s\n", strerror(errno));        return 1;    }    fclose(pf);    pf == NULL;    return 0;}

并没有这个文件,返回空指针,并且打印出对应的错误信息。

有了strerror函数,你就犹如开了写轮眼的卡卡西,精准洞察危险!

也可以这样:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main(){    FILE* pf = fopen("test.txt", "r");    if (pf == NULL)    {        perror("打开文件夹:");        return 1;    }    fclose(pf);    pf == NULL;    return 0;}

结果是一样的,因为 perror就等于printf+strerror。

第三式——写轮眼拷贝!

memcpy

void * memcpy ( void * destination , const void * source , size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。

使用memcpy函数时,需要注意:

数据长度(第三个参数)的单位是字节(1byte = 8bit)。注意该函数有一个返回值,类型是void*,是一个指向destin的指针

 模拟实现memcpy函数

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include<assert.h>void* my_memcpy(void* dest, const void* src, size_t num){void* ret = dest;assert(dest && src);while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;}int main(){int a[] = { 1,2,3,4,5 };int b[10] = { 0 };my_memcpy(b, a, 20);return 0;}

 拷贝成功!


点击全文阅读


本文链接:http://zhangshiyu.com/post/58511.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1