1.定义链表时
typedef struct Node
{ DataType data;
struct Node *next;
}Node;
typedef Node *llist;
容易出现从不兼容的指针类型赋值 从不兼容的指针类型初始化
原因:第一行的Node必须有,而且必须和Node*next中的一致,所以建议改为
typedef struct node
31 { DataType data;
32 struct node *next;
33 }Node;
34
35 typedef Node *llist;
2.文件编程时
if((fp=fopen(fname,"r"))==NULL ) 正确
if(fp=fopen(fname,"r")==NULL) 错误
出现警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
3.错误: expected declaration or statement at end of input
这是因为大括号的少一个,括号的个数不成对,仔细在出错的函数中查找,即可。
4.在调用主菜单时,scanf读取sel反复执行,所以
%c前要输入一个空格, scanf(" %c",&c);
这个空格非常重要,而且容易忽视,当我按3全部删除时,第一次成功第二次按3提示错误输入,找了很久终于找到原因:
%c前面的空格就是用来屏蔽空白符的
1、缓冲区
缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。
2、标准输入流
标准输入流(stdin)是文件指针,scanf()就是从标准输入流获取数据。
以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符(\n)一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符),如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。
所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。