4

在为命令控制台编写 C 语言时,如果您有一个函数尝试使用 SCANF 向用户输入 CHAR 变量,并且用户键入CTRL+Z (EOF) 并按回车,会发生什么情况?

例如:

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

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

4

3 回答 3

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(). 如果出现错误,那将是读取的字符的值unsigned char或负的 int ( EOF)。例如,阅读 的描述fgetc()

于 2009-10-13T17:59:21.903 回答
4

从 Linuxscanf(3)手册页:

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

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

于 2009-10-13T17:42:42.740 回答
-1

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

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

于 2009-10-13T17:48:47.183 回答