首页 文章

C编程:EOF作为一个角色

提问于
浏览
4

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

例如:

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

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

3 回答

  • 4

    首先要做的事情:

    SCANF 未由语言定义 .
    CHAR 未由该语言定义 .

    好的,开始了......

    scanf() 函数返回一个整数 . 如果在第一次转换之前发生输入故障,则该整数是指定的输入项数或宏 EOF 的值 .
    你没有检查 scanf() 调用的返回值,所以你不知道发生了什么 . 一切都可能正常,或者输入流可能在第一次转换之前结束,或者(不是%c)可能存在转换失败 .

    测试 scanf() 的返回值 . 的确, always test the return value of all <stdio.h> functions .

    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()的描述 .

  • 11

    从Linux scanf(3) 联机帮助页:

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

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

  • -1

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

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

相关问题