关于《C语言陷阱与缺陷》内提到的getchar()函数细节探讨

继续看了一部分文章,看到getchar()部分尤其感兴趣,值得注意的是,作者提到

((c = getchar()) != EOF)实际上不是良好定义(Well-define)的,因为getchar返回了一个int值,而我们常常定义c为char 型。

这会出现复制过程中的截断现象,从int强行赋值给char。

因此这里有两种可能性。有时一些合法的输入字符会导致c携带和EOF相同的值,有时又
会使c无法存放EOF值。在前一种情况下,程序会在文件的中间停止复制。在后一种情况
下,程序会陷入一个无限循环。
实际上,还存在着第三种可能:程序会偶然地正确工作。C语言参考手册严格地定义了
表达式

不过试了很多次,我还是没有找到一个输入可以达到作者提到的前两种情况

这里会附上测试截图和原文代码。

image

代码点击更多。

/*
 * 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;
}

此条目发表在C, 编程分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注