我知道fflush(stdin)
会导致未定义的行为,因为fflush
仅为输出缓冲区定义。
但是为什么??是否有历史原因不为输入缓冲区定义fflush
?
C ++提供了一种清除标准输入缓冲区cin.clear()
的方法,我不明白为什么在C标准中未定义它。
答案 0 :(得分:7)
为什么应该 fflush(stdin)
被定义?从程序的角度来看,缓冲是透明的,因此fflush(stdin)
可以不丢弃任何内容,或者可以消耗和丢弃整个输入数据流。与输出流不同,程序控制输出的内容,而程序不知道输入缓冲区中的内容。
fflush(stdin)
的结果充其量是不清楚的-没有明确的方法来说明其作用。只需在不是指定其行为的平台上的行缓冲模式的终端上的输入流上尝试它即可。然后更改缓冲区的大小,然后重试。您随后读取的数据可能会得到完全不同的结果。
答案 1 :(得分:2)
与普遍看法相反,尚不清楚fflush(stdin)
应该做什么:
ungetc()
推回的字节,实际上某些系统以这种方式实现它。当在各种广泛使用的历史平台上以不同的不兼容方式实现功能时,C标准的基本原理似乎未尝试指定任何东西,因为这会使许多现有平台不一致。因此,fflush(stdin)
仅被指定为具有未定义的行为。
请注意,最常见的预期语义很容易实现为功能:
/* discard the rest of a line of pending input.
* return EOF at end of file
*/
int flushline(FILE *fp) {
int c;
while ((c = getc(fp)) != EOF && c != '\n')
continue;
return c;
}