字符串+内存函数学习笔记

本文详细讲解了回调函数的概念,以及如何在C语言中处理二维数组、字符串函数如strlen、strcpy、strtok和strerror的用法,还介绍了字符分类与转换、内存拷贝函数如memcpy、memmove、memcmp和memset的使用。
摘要由CSDN通过智能技术生成

该文章是我对这一章节上课时较为不熟悉点的记录,可能文章略长。

024/02/24

  1. 回调函数的定义,回调函数本身不被调用,但可以作为参数,传到另一个函数中被调用。这样的函数称为回调函数。
  2. 二维数组如何只打印左下角数组,不考虑右上角数组
    int arr[10][10] = {0};
    int i = 0;
    for(i = 0;i<10;j++)
    {
        int j = 0;
        for(j=0; j<=i; j++)
        {
        }
    }
  3. strlen() 返回的是无符号整型size_t
    strlen(“abc”) - strlen(“abcdef”) > 0是为true的,因为strlen的返回值是无符号整型
  4. 函数模拟实现list:
    strlen();

    长度不受限制的字符串函数
    strcpy();
    strcat(char* destination, const char* source);
    strcmp();

    长度受限制的字符串函数
    strcnpy();
    strncat();
    strncmp();

    strstr();
      
    strtok();
    该函数第一个参数为想要分隔的字符串,第二个参数为分隔符
    char arr[] = “hello@qq.com”;
    char copy[];
    strcpy(copy, arr);
    使用strtok的时候,一般不会在原字符串上使用,而是创建一个copy数组,因为strtok会改变输入的字符串,在分割处变为’\0’
    char sep[] = “@.”;
    char* ret = strtok(copy, sep);
    printf(“%s”, ret);
    调用strtok这个函数后,返回值为分隔符之前的字符串的第一个字符的地址,同时这个函数会记住第一个分隔符的位置。
    ret = strtok(NULL, sep);
    printf(“%s”, ret);
    第二次调用的时候不是传入copy,传入的是NULL
    ret = strtok(NULL, sep);
    printf(“%s”, ret);
    如果传入\0,那么会返回NULL
    但是以上使用方法是错的,因为不知道会调用几次strtok(NULL, sep);
    正确使用方法为:
    char* ret = NULL;
    for(ret = strtok(copy, sep); ret != NULL; ret = strtok(NULL, sep))
    {
        printf(“%s\n”, ret);
    }
    char sep[] 里的分隔符顺序没有要求,把分隔符全部放进去就可以了

    strerror();
    在C语言中,设计了一个全局变量,errno。在库函数执行时,如果发生错误,会将一个错误码放在errno这个变量当中
    该函数有一个参数,参数为int类型,返回值是char*,char*是错误信息首字符的地址
    可以直接调用 strerror(errno);
      printf(“fopen: %s\n”, strerror(errno));
    =perror(“fopen”);

    字符分类函数
    isspace();
    isdigit();
    isxdigit();
    islower;
    #include <ctype.h>
    isupper();
    isalpha();

    字符转换函数
    tolower();
    toupper();
  5. 打印无符号整型 %u
  6. char* ch1 = “xxxxxxxxxx”;
    char ch2[] = “hello”;
    strcpy(ch1, ch2);   这个代码是错误的,ch2字符串的内容传不到ch1常量字符串里的
  7. char * str = “hello”;
    assert(str);
    assert(str != NULL); 这两种写法都可以,如果str为NULL,两行代码括号内的值都为0
  8. strcat() 不能自己给自己追加,因为会无限制的运行下去。*src永远不会等于’\0’
  9. C语言进阶第八节 01:44:30
    char ch1[20] = “hello world”;
    char ch2[] = “xxx”;
    strncpy = (ch1, ch2, 5);
    strncpy如果*src没有遇到’\0’,n有几个就拷贝几个char到ch1里。如果n超出了src字符串的长度,超出的地方用’\0’拷贝

    strncat = (ch1, ch2, 5);
    strncat增加字符串的时候,如果n大于字符串的长度,不管大于多少,ch1只会增加ch2,而不会用’\0’填补多余的位置。n<字符串长度时,拷贝n个字符完后补’\0’。

2024/02/26

  1. 函数模拟实现
    #include <string.h>
    memcpy();
    dest = (char*)dest + 1;
    不能这样写,   (char*)dest++; 这个强制类型转换只是暂时的,++时候,dest还是个void*类型的指针。
    强制类型转换只是暂时的,不是永久的转变了。
    memcpy是用来处理内存不重叠的拷贝。

    memmove();
    src和dest分三种情况考虑
    src > dest
    1     2     3     4     5     6     7     8     9     10
    ⬆️         ⬆️
    dest       src
    src和dest从前向后走,*dest改变的内容不会影响到*src

    src == dest从前向后和从后向前走也是一样的

    src < dest
    1     2     3     4     5     6     7     8     9     10
    ⬆️         ⬆️
    src         dest
    src和dest从后向前走,*dest改变的内容影响到了*src,src会经过dest改变过的数据区域,所以src<dest的情况只能从后向前走

    memcmp();
    int memcmp(const void* pt1, const void* pt2, size_t num);
    当在num范围内,*pt1和*pt2都想同时返回0。
    在遇到第一个不相同字节时,如果*pt1 < *pt2, return <0
                                                     if *pt1 > *pt2, return >0

    memset();
    void* memset(void* dest, int value, size_t num);
    以字节为单位设置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值