gpt4 book ai didi

c - 为什么 fflush(stdin) 不删除缓冲区 (stdin)

转载 作者:行者123 更新时间:2023-11-30 18:16:55 29 4
gpt4 key购买 nike

我有一个这样的测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char c, str[20];
printf("Enter a character : ");
scanf("%c", &c);
printf("Enter a string : ");
fflush(stdin);
gets(str);
printf("\n\n\nResult : %c\n%s\n", c, str);
return 0;
}

我读过一些文章说这段代码可以工作,因为扫描c字符后,缓冲区中仍然有'\n'字符。 fflush(stdin) 会清除缓冲区,因此 gets() 函数可以正常工作

但事实上,当我在 Mac OS 环境中编译并运行这段代码时,fflush(stdin) 什么也不做。我输入了一个字符(例如“k”),然后它打印了 k 字符和一个“\n”字符。它应该允许我输入一个字符、一个字符串,然后打印它们。有人知道为什么吗?谢谢!

最佳答案

fflush(3)被记录为在输出流上工作,而不是在输入流上工作。

The standards do not specify the behavior for input streams.

特别是POSIX specification for fflush不要提及输入流。所以它可能是 undefined behavior从 POSIX 的角度来看。

但是,在 Linux 上 fflush(stdin) 是可能的(但我不推荐它),因为

For input streams associated with seekable files (e.g., disk files, but not pipes or terminals), fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application.

For input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application.

(请注意提到的可查找文件;通常您的stdin是一个终端,它不是真正的磁盘文件,并且 lseek(2) 将在终端上失败)

顺便说一句,gets(3)弃用,因为危险(可能 buffer overflow!)并且具有 disappeared来自C11标准。至少使用fgets(3)最好getline(3)反而。也许考虑GNU readline库(提供良好的编辑功能)。

关于c - 为什么 fflush(stdin) 不删除缓冲区 (stdin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812749/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com