该文章是我对这一章节上课时较为不熟悉点的记录,可能文章略长。
024/02/24
- 回调函数的定义,回调函数本身不被调用,但可以作为参数,传到另一个函数中被调用。这样的函数称为回调函数。
- 二维数组如何只打印左下角数组,不考虑右上角数组
int arr[10][10] = {0};
int i = 0;
for(i = 0;i<10;j++)
{
int j = 0;
for(j=0; j<=i; j++)
{
}
} - strlen() 返回的是无符号整型size_t
strlen(“abc”) - strlen(“abcdef”) > 0是为true的,因为strlen的返回值是无符号整型 - 函数模拟实现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(); - 打印无符号整型 %u
- char* ch1 = “xxxxxxxxxx”;
char ch2[] = “hello”;
strcpy(ch1, ch2); 这个代码是错误的,ch2字符串的内容传不到ch1常量字符串里的 - char * str = “hello”;
assert(str);
assert(str != NULL); 这两种写法都可以,如果str为NULL,两行代码括号内的值都为0 - strcat() 不能自己给自己追加,因为会无限制的运行下去。*src永远不会等于’\0’
- 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
- 函数模拟实现
#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);
以字节为单位设置