继续看了一部分文章,看到getchar()部分尤其感兴趣,值得注意的是,作者提到
((c = getchar()) != EOF)实际上不是良好定义(Well-define)的,因为getchar返回了一个int值,而我们常常定义c为char 型。
这会出现复制过程中的截断现象,从int强行赋值给char。
因此这里有两种可能性。有时一些合法的输入字符会导致c携带和EOF相同的值,有时又
会使c无法存放EOF值。在前一种情况下,程序会在文件的中间停止复制。在后一种情况
下,程序会陷入一个无限循环。
实际上,还存在着第三种可能:程序会偶然地正确工作。C语言参考手册严格地定义了
表达式
不过试了很多次,我还是没有找到一个输入可以达到作者提到的前两种情况。
这里会附上测试截图和原文代码。
代码点击更多。
/*
* main.c
*
* Created on: 2010-10-10
* Author: ctqmumu
*/
#include
#include
int printhex(unsigned char * setin, int length)
{
int i;
/*IF The litter ending*/
printf("%p[%d]:",setin, length);
for (i=length-1; i>=0; --i)
{
printf("%.2X", setin[i]);
}
printf("\n");
return 0;
}
int main()
{
char a;
int getb;
do
{
getb = getchar();
printhex((unsigned char *)&getb, sizeof(getb));
a = getb;
printhex((unsigned char *)&a, sizeof(a));
putchar(a);
}while (a != EOF);
return 0;
}