【发布时间】:2012-04-03 04:09:13
【问题描述】:
下面是我写的程序。
/*******************************************************************************
* This program reads EOF from standard input stream to store in an integer
* variable and in a character variable. Both values are then output to see the
* stored value as integer.
*******************************************************************************/
#include<stdio.h>
int main (void)
{
/* Local Declarations */
int num;
char ch;
/* Read EOF as character & integer and display values stored */
printf("\nPlease only input EOF for all input prompts below");
printf("\nNumber? ");
scanf("%d", &num);
printf("\nThat integer input converts to %d", num);
printf("\nCharacter? ");
scanf(" %c", &ch);
printf("\nThat character input converts to %d", ch);
/* Check if any of the stored values are recognized as EOF */
if(num == EOF)
printf("\nNumber is an EOF");
if(ch == EOF)
printf("\nCharacter is an EOF");
/* Exit Program */
printf("\n");
return 0;
}// main()
我在 Ubuntu 11.10 上使用 gcc 编译。它无法识别程序中 EOF 的 Ctrl-D 并在尝试打印其值时输出 0。上面程序在我的终端上的输出如下。
Please only input EOF for all input prompts below
Number?
That integer input converts to 0
Character?
That character input converts to 0
注意:当我为两个输入按下 CTRL-D 时,终端不会回显 CTRL-D,因此在上述程序执行中不可见。
我读过 EOF 在 stdio.h 和 stdlib.h 中被定义为一个整数,并且传统上定义为 -1。另外,我知道 Ctrl-D 模拟标准输入的 EOF。那为什么将其存储到整数变量时不转换为-1?
【问题讨论】:
-
你的程序应该调用
fflush,并在printf格式字符串的end中有\n! -
@BasileStarynkevitch 感谢您指出这一点。在开始读取字符值之前,我必须刷新流以读取 int 值。但是为什么建议将
\n放在printf格式字符串的末尾而不是开头呢?我在我用来学习 C 的 book 中看到了这个约定,发现它有点奇怪。 -
因为
printf的许多实现都在\n换行符处刷新输出缓冲区。所以你的书在这方面是错误的,你真的应该养成把它放在格式字符串末尾的习惯。这就是大多数 Linux 实用程序(例如 shell、make或gcc本身)正在做的事情。 -
@BasileStarynkevitch 在 EOL 上刷新输出缓冲区?我认为当文件标记放在 EOF 上时,输出流会被刷新。请告诉我们更多信息(我知道您是 GCC 开发人员:-)。
-
详细了解
setlinebuf函数。在 Linux 上(可能在 Posix 系统上),当 stdout 是终端时,它通常是行缓冲的。