对getchar()和fflush(stdin)行为感到困惑

时间:2016-11-19 22:24:27

标签: c

我认为getchar()fflush(stdin)用于获取前一个输入留下的换行符或空格,因为gets()函数无法区分该换行符和我们提供的输入。当我们在%s函数上使用scanf时,我们不需要这些。当我们在同一个函数上使用%c%d时,为什么还需要它?

1 个答案:

答案 0 :(得分:1)

事实是fflush()没有为输入流定义行为,有一些特定的实现定义行为。此外, glibc 中有fpurge()可以满足您的需求。

使用scanf()时,规则是当它找到由isspace()返回的空白字符时会停止,除非使用行为不同的%c,因为它可以捕获空格,如果前面有空格,则忽略它们。

此外,gets()功能很危险,最近已从标准中移除,因此您不应使用它或将其作为示例参考。

fgets()函数是gets()的更好版本,如果可以的话,会捕获最终'\n',即如果到目前为止捕获的字符数不超过它是第二个参数,因此您不需要刷新之后的任何内容。

您应该考虑,scanf()不仅会将最后一个'\n'留在输入缓冲区中,而且还会在其后面留下任何空格。因此,单个getchar()通常是不够的,您应getchar()留下尽可能多的空白,以确保fflush(stdin)的明显行为。