VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: yifei110

scanf的诡异

[复制链接]

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-3-16 22:30:01 | 显示全部楼层
fflush和stdin都是ansi c规定的,怎么称得上未定义呢。
c语言里可以清流状态的,只有这个函数了。
回复

使用道具 举报

0

主题

11

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-18 19:30:02 | 显示全部楼层
fflush 和 stdin 都是 ANSI C 的,但是 fflush(stdin) 是未定义的。

都是 flush 下水管,谁见过 flush 水龙头的?
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-3-19 14:00:01 | 显示全部楼层
自己打开stdio.h看吧
extern FILE (*_imp___iob)[];
#define _iob    (*_imp___iob)
#define stdin  (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
stdin既然是FILE*的,fflush当然要确保它正确。
都是下水管,哪来的水龙头啊?
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-19 18:45:01 | 显示全部楼层
有意思,学习
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-3-20 05:30:01 | 显示全部楼层
To:superandy
这个可能不能只想键盘。

是K&R的《The C Programming Language》上说的:
附录B1.1:
On an output stream, fflush causes any buffered but unwritten data to be written; on an input stream, the effect is undefined.

C语言标准上当然也有提到。
C99 7.19.5.2
(2) If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

我是这样理解的:虽然对于一般的键盘及其驱动模式来说,清一个键盘的缓冲区,其意义完全是可以理解的。
但C/C++的“标准输入流”却不一定指向一般键盘,而且还可以被重定向。
比如,如果stdin被重定向到一个文件,那么对一个文件输入进行“flush”,其意义难道不令人费解吗?是要把读到内存里的部分都丢弃?还是按行丢弃?如果是二进制文件呢?
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-3-24 09:30:01 | 显示全部楼层
an update stream in which the most recent operation was not input你准备怎么理解?
msdn上的话比较干脆
The fflush function flushes a stream. If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. fflush negates the effect of any prior call to ungetc against stream. Also, fflush(NULL) flushes all streams opened for output. The stream remains open after the call. fflush has no effect on an unbuffered stream.

回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-3-24 22:45:01 | 显示全部楼层
an update stream in which the most recent operation was not input
当然是读写的流,而且最近的一次操作不是读。

至于MSDN上怎么说,那仅代表微软的态度了,呵呵。
我以前也曾经提过,实践证明,fflush(stdin)在VC,以及DOS的TC中都是可行的,呵呵。
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-3-25 02:45:02 | 显示全部楼层
微软既然那么说,想必它当然也是那么支持的,它只是跟标准不一致而已。
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-3-25 12:00:01 | 显示全部楼层
windows平台的devcpp/bcb/intel编译器都如此支持fflush(stdin);
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-3-26 10:30:01 | 显示全部楼层
一定要用最标准的方法,那么只有while(getchar() != '\n');了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表