C语言基础12

复习:
1、输出缓冲区
程序输出的数据并没有立即写入"文件",而先存储到了缓冲区中,当满足一定的条件后才写入文件:
1、从输出切换到输入
2、遇到换行符
3、程序结束
4、缓冲区满4K
5、手动刷新 fflush
2、输入缓冲区
在终端输入数据时此时数据暂由终端保管,当按下回车键,数据由终端写入到程序的输入缓冲区,scanf函数再从输入缓冲区中读取数据赋值给变量。

1、当想从输入缓冲区中读取整型和浮点型数据时,而缓冲区中的数据是字母或符号,此时会读取失败,并且不会从缓冲区中拿走字母或符号,导致接下来的数据读取都出问题。
解决方案:根据scanf函数返回值,判断变量是否从缓冲区中读取成功,然后清空缓冲区并重新输入。
scanf("%*[^\n]");
scanf("%*c");

2、当使用fgets读取字符串时,如果输入的字符超过size-1个,缓冲区中就会残留数据,这样会影响接下来的数据读取。
解决方案:判断读取的字符串最后一个字符是否\n,如果不是则说明缓冲区中有残留数据。
scanf("%*[^\n]");
scanf("%*c");

3、当先输入整型或符点型数据再输入字符或字符串时,前一次可能会残留一个’\n’,会影响字符或字符串的输入。
输入字符:
scanf(" %c");

输入字符串:
scanf("%*c");
gets(str);

3、常考的字符串处理函数
strlen、strcpy、strcat、strcmp
memcpy、memmove
4、常用的字符串处理函数
sscanf 从字符串解析数据
sprintf 把各种类型的数据拼接成字符串

预处理指令:
程序员所编写的代码并不能被真正的编译器编译,需要一段程序把翻译一下。
翻译的过程叫预处理,被翻译的代码叫预处理指令,以#开头的都是预处理指令。

查看预处理结果:
gcc -E code.c 把预处理的结果显示在屏幕上
gcc -E code.c -o code.i 把预处理的结果存储到code.i文件中

预处理指令的分类:
#include 文件包含
#include <> 从系统指定的路径查找并导入头文件
#include “” 先从当前路径查找如果没有再从系统指定的路径查找并导入头文件。
操作系统通过设置环境变量来指定头文件查找路径,或者设置编译器参数 -I /path
#define 定义宏
宏常量:#define MAX 100
优点:提高可扩展性、提高可读性、提高安全性高、还可用在case后。
注意:一般宏名全部大写,末尾不要有分号
预定义的宏:
func 获取函数名
FILE 获取文件名
LINE 获取当前行号
DATE 获取当前日期
TIME 获取当前时间

宏函数:其实就是带参数的宏
不是真正的函数,不检查参数类型,没有传参,没有返回值。
#define dfunc(a,b,c) (a+b+c)/3
1、把代码使用到宏函数替换为,宏函数后面的代码。
2、把宏函数代码中使用的参数替换为调用者提供的参数。
注意:定义宏常量和宏函数不能换行,可以使用续行符\,也可以使用大括号来保护代码。
·
练习:实现一个交换两个变量的宏函数,通用。

宏的二义性:
由于代码所处位置、参数不同导致宏有不同的功能,这种宏的二义性。
如何避免二义性:宏函数整体要加小括号,每个参数都要加小括号。
注意:容易出现选择题,如:那个宏可能有二义性。
注意:使用宏函数时提供带自变运算符的变量作为参数。

常见笔试面试题:
如果是普通类型,它们功能没有区别。
#define INTP int*
INTP p1,p2,p3; // p1是指针,p2,p3是int类型变量
typedef int* INTP;
INTP p1,p2,p3; // p1,p2,p3都是指针

宏函数与普通的函数区别?
它们是什么
宏函数不是真正的函数,而代码替换,只是用着像函数。
函数:是一段具有某项功能的代码,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的命名空间、栈内存。
有什么不一样
函数 返回值 类型检查 安全 压栈、出栈 速度慢 跳转
宏函数 运算结果 通过 危险 替换 速度快 冗余
优缺点
条件编译:
根据条件让代码是否参与最终的编译。
#if
#elif
#else
#end

头文件卫士,防止头文件被复包含。

判断调试或上线
#ifdef DEBUG
#define debug(…) printf(VA_ARGS)
#else
#define debug(…)
#endif

#define error(…) fprintf(stdout,"%s:%s:%d %s %m %s %s\n",FILE,func,LINE,VA_ARGS,DATE,TIME)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值