3 回答
TA贡献1829条经验 获得超7个赞
scanf
scanf
scanf
gets
scanf
gets
: scanf
gets
scanf
printf
scanf
scanf
scanf
scanf
scanf
strto...
scanf
scanf
fscanf
sscanf
scanf
TA贡献1871条经验 获得超13个赞
scanf
有很多问题-见问题 12.17,12.18 a ,和 12.19..另外, %s
格式也有同样的问题 gets()
有(见问题) 12.23很难保证接收缓冲区不会溢出。 [脚注]
更广泛地说, scanf
是为相对结构化的格式化输入设计的(它的名称实际上是从“扫描格式化”派生出来的)。如果你注意,它会告诉你它是成功的还是失败的,但它只能告诉你它是在哪里失败的,而根本不知道它是如何或为什么失败的。您几乎没有机会进行任何错误恢复。
然而,交互式用户输入是最不结构化的输入。一个设计良好的用户界面将允许用户输入几乎任何东西-不仅仅是字母或标点符号(当数字被期望时),而且比预期的字符更多或更少,或者根本没有字符( E.,只是返回键),或过早的EOF,或任何东西。当使用 scanf
;读整行要容易得多(用 fgets
),然后用 sscanf
或者其他一些技巧。(功能如 strtol
,strtok
,和 atoi
通常是有用的;参见 12.16和 13.6)如果你真的使用任何 scanf
变量,请确保检查返回值,以确保找到了预期的项目数。另外,如果你用 %s
,确保防止缓冲区溢出。
请注意,顺便说一句,对.的批评 scanf
不一定要起诉 fscanf
和 sscanf
.scanf
读自 stdin
,这通常是一个交互式键盘,因此是最小的限制,导致最多的问题。另一方面,当数据文件具有已知的格式时,使用 fscanf
..使用 sscanf
(只要检查了返回值),因为恢复控制非常容易,所以重新启动扫描,如果不匹配则丢弃输入,等等。
其他链接:
参考文献:K&R2,SEC.7.4第159页
- 3 回答
- 0 关注
- 397 浏览
添加回答
举报