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

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

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

528174f215e5b1c72db6ced9d80ef94d_bcb86dbed745de164ace49de7729ab48.jpeg


第一式——雷切!


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;
}


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


运行结果如下:


514dda6277bc6743302db7d603e372d3_22e7da9c3fee4b99b4aff9ce4979793f.png


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


#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;
}


a40a6d70be46ada44b55b63fbd8f72e2_4ee54fdd47e240f2b953f765e8cde503.png


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


有了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;
}

669b57f15cbea92001837a920d999eaf_bfbdc5074ecc44919b6b348958e5f85e.png


拷贝成功!


相关文章
|
4月前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
184 60
|
4月前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
85 1
|
9月前
35.鸡兔同笼问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
35.鸡兔同笼问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
70 0
|
人工智能 异构计算
【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图
黄昏见证虔诚的信徒,巅峰诞生虚伪的拥护
313 0
【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图
kali2023.1配置模拟钢琴midi环境(圆it/网安猫猫们的钢琴梦)
kali2023.1配置模拟钢琴midi环境(圆it/网安猫猫们的钢琴梦)
66 0
|
缓存 监控 Linux
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(二)
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(二)
149 0
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(二)
|
算法 安全 Unix
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(一)
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(一)
114 0
rsync 远程同步(日落尤其温柔的人间皆是浪漫)(一)
|
存储
【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理
【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理
228 0
|
前端开发 Python
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
学习笔记 | Python程序基本格式及trutle绘图函数库(奥运五环、太阳花、五角星、运动时钟、玫瑰花实例附源码)
洛谷【1】超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。
洛谷【1】超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。