从stdin读取一个字符:getc Vs getchar Vs Scanf

24

以下三个函数中:

getc、getchar 和 scanf,

哪个函数最适合从标准输入流中读取一个字符?为什么?

这些函数是否存在已知的缺陷或限制,使其中一个函数比其他函数更好?


注:本回答保留原始的HTML标签格式。
2个回答

31

如果你只想从标准输入中读取单个字符,那么getchar()是合适的选择。如果你有更复杂的要求,getchar() 就不够用了。

  • getc() 允许你从不同的流(比如使用 fopen() 打开的流)中读取;
  • scanf() 允许你一次读取多个字符。

使用 getchar() 最常见的错误是尝试使用 char 变量来存储结果。你需要使用一个 int 变量,因为 getchar() 返回值的范围是 "在无符号字符范围内的值,加上单个负值 EOF"。一个 char 变量的范围不足以容纳这个范围,这可能会导致将有效的字符返回与 EOF 混淆。对于 getc() 也是同样的情况。


1
谢谢回复。如果在scanf中只给出%c,那么我应该只能读取一个字符,对吗? - Jay
是的,但对于那个目的来说有点过头了。 - caf
2
有些地方的 getchar() 是一个能快速返回字符(带缓冲流)或使用 fread() 来获取字符的宏,用 scanf() 的话就会有很多不必要的工作,感觉非常过度了。 - tomlogic

5

来源Beej's指南C编程

所有这些函数都以某种方式从控制台或文件中读取一个字符。它们之间的区别相当小,下面是描述:

getc()从指定的文件返回一个字符。从使用角度来看,它等同于相同的fgetc()调用,而且fgetc()更常见。只有两个函数的实现不同。

fgetc()从指定的文件返回一个字符。从使用角度来看,它等同于相同的getc()调用,除了fgetc()更常见外。只有两个函数的实现不同。

是的,我作弊了,最后一段我使用了剪切和粘贴。

getchar()从stdin返回一个字符。实际上,它与调用getc(stdin)相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接