# 用宏定义简单的函数
一些简单的函数可以用 #define 完成,如 min () 和 max () 函数,还可以适用任意数据类型
#define min(a,b) (a < b ? a : b) | |
#define max(a,b) (a > b ? a : b) |
# 函数传参空指针
理论上用一级指针传空指针不会报错,但是无法指向你想要的变量。
打个比方,你要创建一个二叉查找树,你传了一个空指针的根节点 root 进入 Insert 函数,节点是有了,但主函数的 root 依旧是空指针。而实际传参空指针要用二级指针,返回主函数的 root 才不是空指针,格式如下。
typedef int* point; | |
typedef point* adress; | |
typedef int ElementType; | |
adress Insert(adress T,ElementType element); | |
int main() | |
{ | |
point p = NULL; | |
Insert(&p,element); | |
} | |
adress Insert(adress T,ElementType element) | |
{ | |
if(*T==NULL) | |
{ | |
*T = malloc(sizeof(ElementType)); | |
..... | |
} | |
..... | |
return T; | |
} |
或者还有一种方法,即自己给自己套娃,我更推荐这一种,多级指针很让人头疼。举个例子。
typedef int* point; | |
typedef int ElementType; | |
adress Insert(adress T,ElementType element); | |
int main() | |
{ | |
point p = NULL; | |
p = Insert(p,element); | |
} | |
point Insert(point T,ElementType element) | |
{ | |
if(T==NULL) | |
{ | |
T = malloc(sizeof(ElementType)); | |
..... | |
} | |
..... | |
return T; | |
} |
# 程序输出中文乱码
现在程序默认编码都是 UTF-8 编码,可惜中文是 GBK 编码,如果 vscode 没配置好的话就会乱码,一劳永逸的方法是使用 system () 函数,用法见下面程序。
#include<stdlib.h>// 需要包含此头文件 | |
int main(int argc, char **argv) | |
{ | |
..... | |
system("chcp 65001"); | |
} |
# 从文件中逐字符读取
下面的写法是错误的。
int main(int argc, char **argv) | |
{ | |
FILE *f = fopen("2.txt", "rb"); | |
if (f == NULL) return -1; | |
char c; | |
while (!feof(f)) { | |
printf("%c",c); | |
fread(&c, 1, 1, f); | |
} | |
} |
结果是末尾多打印一个字符。原因是 feof 函数只是检测当前的文件指针是否是文件末尾,而不是检测下一个文件指针所指位置是否是文件末尾。举个例子,打印 1234567 时,当 fread 函数读到 7 时,文件指针指向 7,此时 feof 函数的检测也是指向 7 的文件指针,所以会再进一次循坏,而 c 这一次从 fread 函数读取不到数据,所以打印之前保留的字符。
所以正确写法要么进循环前先 fread 一次再用 feof 判断,要么直接用 fread 的返回值去判断。
#include <stdio.h> | |
int main(int argc, char **argv) | |
{ | |
FILE *f = fopen("2.txt", "rb"); | |
if (f == NULL) return -1; | |
char c; | |
// 第一种写法 | |
fread(&c, 1, 1, f); | |
while (!feof(f)) { | |
printf("%c",c); | |
fread(&c, 1, 1, f); | |
} | |
// 第二种写法 | |
while (fread(&c, 1, 1, f)) { | |
printf("%c",c); | |
} | |
} |