C编程:EOF作为一个角色
当为命令控制台编程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。
首先要做的事情:
SCANF
不是由语言定义的。
CHAR
不是由语言定义的。
好的,开始了……
scanf()
函数返回一个整数。 如果在第一次转换之前发生输入故障,则该整数是分配的输入项的数量或宏EOF
的值。
你没有检查scanf()
调用的返回值,所以你不知道发生了什么。 一切都可能正常,或者输入流可能在第一次转换之前结束,或者(不是%c)可能存在转换失败。
测试scanf()
的返回值。 实际上, 总是测试所有
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()
的描述。
从Linux scanf(3)
联机帮助页:
“如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF 。如果发生读取错误,也会返回EOF ,在这种情况下,流的错误指示符(参见ferror(3)
)已设置,并且设置了errno表示错误。“
请注意,此段落涉及scanf
的返回值,而不是结果参数。
这取决于您正在使用的命令shell,但您实际上不应该设计任何期望从交互式提示中读取控制字符的程序。
大多数命令shell将拦截一些控制字符并使用它们来告诉shell执行操作。 例如ctrl-s和ctrl-q经常启动和停止shell的输出字符显示。 某些shell上的ctrl-z实际上将被视为关闭shell的命令。