# 用宏定义简单的函数

一些简单的函数可以用 #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);
  }
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Jelly27th 微信支付

微信支付

Jelly27th 支付宝

支付宝