当为命令控制台编程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 回答
首先要做的事情:
SCANF
未由语言定义 .CHAR
未由该语言定义 .好的,开始了......
scanf()
函数返回一个整数 . 如果在第一次转换之前发生输入故障,则该整数是指定的输入项数或宏EOF
的值 .你没有检查
scanf()
调用的返回值,所以你不知道发生了什么 . 一切都可能正常,或者输入流可能在第一次转换之前结束,或者(不是%c)可能存在转换失败 .测试
scanf()
的返回值 . 的确, always test the return value of all <stdio.h> functions .当
scanf()
调用的结果为EOF
时,如果需要有关输入失败原因的更多信息,可以使用feof()
和/或ferror()
.回答你的问题:
what will promptChar() return?
它将返回char类型的不确定值 .
您可以按照处理字符的库函数示例并从
promptChar()
返回一个int . 如果出现错误,那将是字符读取到unsigned char
或负int(EOF
)的值 . 例如,阅读fgetc()的描述 .从Linux
scanf(3)
联机帮助页:“如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值 EOF . 如果发生读取错误,也会返回 EOF ,在这种情况下,将设置流的错误指示符(请参阅
ferror(3)
) ,并设置errno表示错误 . “请注意,此段落涉及
scanf
的返回值,而不是结果参数 .这取决于您正在使用的命令shell,但您实际上不应该设计任何期望从交互式提示中读取控制字符的程序 .
大多数命令shell将拦截一些控制字符并使用它们来告诉shell执行操作 . 例如ctrl-s和ctrl-q经常启动和停止shell的输出字符显示 . 某些shell上的ctrl-z实际上将被视为关闭shell的命令 .