由EOF和NULL引起的一个C程序的分析
来源:互联网 发布:淘宝活性炭都是假的吗 编辑:程序博客网 时间:2024/05/22 04:29
看一个程序,这个程序在执行时会出现无限循环:
#include<stdio.h>
#include<conio.h>
void main()
{
char c;
FILE *fp;
if((fp=fopen("c://wlj.cpp","r"))==NULL)
printf("error");
while((c=fgetc(fp))!=NULL) /*while((c=fgetc(fp))!=EOF) */
printf("%c",c);
fclose(fp);
c = 255;
printf("%d %d",sizeof(short),c);
getch();
}
分析:
1. 这个程序在执行会出现死循环,因为文件结尾会返回EOF=-1,而NULL被定义为0或
参考:
在/Vc7/include/stdio.h中
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
/**/
#define EOF (-1)
在/TC/include/stdio.h中
/**/
#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL
#endif
#endif
/* End-of-file constant definition
*/
#define EOF (-1) /* End of file indicator */
2. 在TC2.0、TC3.0和VC7.0中单步调试代码时可以设定观察变量c和(int)c,可以发现遇到回车换行符是读出的c=’/n’, (int)c=10,即ASCII中的LF(line feed),且仅仅是一个LF字符,没有CR (13)字符,这在写给文本加解密的程序时时要注意的,大二时写过对txt文件用异或算法加解密的程序,但是后来却发现解密(还原)后的文件有乱码,其实就是对回车换行符处理出了错误。
3. 遇到EOF字符时结果有些不同:
c
(int)c
TC2.0
‘ ‘
-1
TC3.0
‘ ‘
255
VC7.0
‘ ‘
-1
由此可以看出,在三种环境中char类型有类似如下的定义
TC2.0
#define char signed short
TC3.0
#define char unsigned short
VC7.0
#define char signed byte
4. getc不可能返回NULL(0)字符。
5. 此程序的最开始版本是
#include<stdio.h>
#include<conio.h>
void main()
{
char a[1000],c;
int i=0,j;
FILE *fp;
if((fp=fopen("c://my.cpp","r"))==NULL)
printf("error");
while((c=fgetc(fp))!=NULL) a[i++]=c;
for(j=0;j<=i-1;j++) printf("%c",a[j]);
fclose(fp);
getch();
}
这样的话程序更容易出错,因为boldfaced代码行出现无限循环时,数组a会出现越界,而C/C++没有数组越界检查,这样会造成内存的错误使用而使程序非法终止。
- 由EOF和NULL引起的一个C程序的分析
- 由主键和序列号设置而引起的一个问题
- 由一段程序引起的volatile认识
- 由编译警告引起的程序错误
- 一个由模板函数引起的问题
- 一个由sscanf函数引起的bug
- 一个由__GNUC__引起的编译问题
- C语言中EOF NULL NUL和'\0'的区别和使用
- 程序猿之---C语言细节19(来找茬,由/* */ 引起的注释错误)
- 由printf引起的
- 由小程序引起的思考----关于字段和方法的分派
- 一个由C/C++编译的程序占用的内存
- 一个由C/C++编译的程序占用的内存
- 一次由查询转换引起的性能问题的分析
- 由关于malloc的一个争论引起的探究
- 由关于malloc的一个争论引起的探究
- 由一个例子引起的对递归原理的理解。
- 由一个bug引起的关于list的思考
- 与存储过程sp_MSforeachdb类似的存储过程sp_MSforeachdb
- 【原创】搞了个NetGear的路由器,为此写了个小程序来查Wan IP.
- 关于子类对象的实例化过程
- 比尔·盖茨--美国肥沃的创业土壤里长出的大树
- Subversion for Windows 安装指南
- 由EOF和NULL引起的一个C程序的分析
- 看CSDN测试后,关于领导职工显示的问题!!!
- 一个让98%的JAVA程序员犯难的程序
- 欢迎
- 《深度探索C++对象模型》读书笔记(1)
- Dive Into Python学习日志
- lljs的J@Whiz1.4笔记
- 华为交换、路由器常见命令
- 世界是平的 企业要实时