函数笔记本索引
- 一本笔记本,记录一些新遇到的东西。
1. qsort函数
函数基本介绍
- qsort函数是C语言编译器函数库自带的 快速排序 函数。
- qsort 的函数原型是void qsort(void* base, size_t num, size_t width, int(__cdecl* compare)(const void*,const void*)); 是对base所指数组进行排序。
- qsort函数包含在C标准库- <stdlib.h>中。
参数 | 介绍 |
---|---|
base | 指向要排序的数组的第一个元素的指针。 |
nitems | 由 base 指向的数组中元素的个数。 |
size | 数组中每个元素的大小,以字节为单位。 |
compar | 用来比较两个元素的函数,即函数指针(回调函数) |
【回调函数】一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。
qsort(a, 1000, sizeof(int), comp);//比如说对1000个整数进行排序
int compare(const void*a, const void* b){
return *(int*)a - *(int*)b;//此为由小到大排序(chosen)
//return *(int*)b - *(int*)a; //此为由大到小排序
}
compare函数原型
compare( (void *) & elem1, (void *) & elem2 );
Compare 函数的返回值 | 描述 |
---|---|
< 0 | elem1将被排在elem2前面 |
0 | elem1 等于 elem2 |
> 0 | elem1 将被排在elem2后面 |
详情见 qsort_百度百科
笔记
- 在使用qsort之前,首先应该定义回调函数compare。定义回调函数时,对不同的排序对象应该“因材施教”——返回不同的值。
- qsort函数不返回任何值。
2. malloc函数
函数声明(函数原型)
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
与 new函数 比较
从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。
int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int)
或
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100
而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
- malloc 函数返回的是 void* 类型。
如果你写成:p = malloc (sizeof(int));
则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量 ”。所以必须通过 (int *) 来将强制转换。 - 第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。
若写为int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。 - 另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。leetcode之【两数相加】C中的错误处理方式
- 关于返回值:分配成功返回指向该内存的地址,失败则返回
NULL
。 - 当内存不再使用时,应使用
free()函数
将内存块释放。 - 更详细的,见malloc函数,详解
3. strcmp函数
strcmp
函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2)
,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
头文件:string.h
规则
- 当s1<s2时,返回为负数;
- 当s1=s2时,返回值= 0;
- 当s1>s2时,返回正数。
说明
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:
1.“A”<“B”
2.“A”<“AB”
3.“Apple”<“Banana”
4.“A”<“a”
5.“compare”<“computer”
特别注意:strcmp(const char *s1,const char * s2)
这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
ANSI标准规定,返回值为正数,负数,0 。而确切数值是依赖不同的C实现的。
- 当两个字符串不相等时,C标准没有规定返回值会是1 或 -1,只规定了正数和负数。
- 有些会把两个字符的ASCII码之差作为比较结果由函数值返回。但无论如何不能以此条依据作为程序中的流程逻辑。
相关函数
函 数 名 | 作 用 |
---|---|
strcmp() | 对两个字符串进行大小写敏感的比较 |
strcmpi() | 对两个字符串进行大小写不敏感的比较 |
stricmp() | 同strcmpi() |
strncmp() | 对两个字符串的一部分进行大小写敏感的比较 |
strnicmp() | 对两个字符串的一部分进行大小写不敏感的比较 |
int strcmp(const char* s1, const char* s2);
int strncmp(const char* str1, const char* str2, size_t n);
strncmp函数详
情见strncmp百度百科
strcmpi函数
详情见strcmpi百度百科
strnicmp函数
详情见strnicmpy百度百科(这个词条略有小问题)
4. memset函数
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
void *memset(void *s, int ch, size_t n);
函数解释
将s中当前位置后面的n个字节 (typedef unsigned int size_t )
用 ch 替换并返回 s 。
作用
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
函数原型
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组
c:是赋给buffer的值
count:是buffer的长度.