C编程:EOF作为一个角色

时间:2009-10-13 17:36:11

标签: c char eof

为命令控制台编程C时,如果您有一个函数尝试使用SCANF向用户输入CHAR变量,并且用户输入 CTRL + Z (EOF)并点击进入?

例如:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}

如果用户输入 CTRL + Z 并点击输入,那么promptChar()会返回什么?因为如果我理解EOF,那就是一个int。

3 个答案:

答案 0 :(得分:11)

首先要做的事情:

SCANF不是由语言定义的 语言未定义CHAR

好的,不管怎样......

scanf()函数返回一个整数。如果在第一次转换之前发生输入故障,则该整数是分配的输入项数或宏EOF的值。 您没有检查scanf()电话的返回值,因此您不知道发生了什么。一切都可能正常,或者输入流可能在第一次转换之前结束,或者(不是%c)可能存在转换失败。

测试scanf()的返回值。实际上,总是测试所有< stdio.h>的返回值。功能

char ch;
int result = scanf("%c", &ch);
if (result == 1) /* all ok */;
else if (result == 0) /* conversion failure: value of `ch` is indeterminate */;
else if (result == EOF) /* input failure; value of `ch` is indeterminate */;

如果scanf()来电的结果为EOF,如果您想了解有关输入失败原因的更多信息,可以使用feof()和/或ferror()

else if (result == EOF) {
    if (feof(stdin)) {
        /* no data in input stream */
    }
    if (ferror(stdin)) {
        /* error if input stream (media ejected? bad sector? ...?)
    }
}

回答你的问题:what will promptChar() return?

它将返回char类型的不确定值 您可以按照处理字符的库函数示例并从promptChar()返回一个int。如果出现错误,那将是转换为unsigned char或负int(EOF)的字符读取值。例如,请阅读fgetc()的说明。

答案 1 :(得分:4)

来自Linux scanf(3)联机帮助页:

“如果在第一次成功转换或匹配失败之前达到输入结束,则返回值 EOF 。如果读取错误,也会返回 EOF 发生,在这种情况下,流的错误指示符(请参阅ferror(3))已设置,并且设置了errno表示错误。“

请注意,此段落涉及scanf的返回值,而不是结果参数。

答案 2 :(得分:-1)

这取决于您使用的命令shell,但您实际上不应该设计任何程序来期望从交互式提示中读取控制字符。

大多数命令shell将拦截一些控制字符并使用它们来告诉shell执行操作。例如ctrl-s和ctrl-q经常启动和停止shell的输出字符显示。某些shell上的ctrl-z实际上将被视为关闭shell的命令。