C编程:EOF作为一个角色

Tha*_*yen 4 c char eof

当为命令控制台编程C时,当你有一个试图使用SCANF向用户输入CHAR变量的函数,并且用户输入CTRL+Z(EOF)并命中输入时会发生什么?

例如:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}
Run Code Online (Sandbox Code Playgroud)

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

pmg*_*pmg 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 */;
Run Code Online (Sandbox Code Playgroud)

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? ...?)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

它将返回char类型的不确定值.
你可以按照库函数的例子来处理字符并从中返回一个int promptChar().这将是字符读取的值unsigned charEOF错误的负int().fgetc()例如,阅读说明.

  • @Patrice:不是真的,`c`的值不是`c`本身或它的地址.返回指向它们的指针时,会发生返回局部变量的问题. (2认同)