getchar()和scanf("%c")的功能都是从STDIN读一个字符,单论功能两者没有区别

但两者的返回值是有区别的:

------------------------------------------------

scanf()的详尽介绍请移步这里

-------------------------------------------------

scanf()的返回值的含义是:

On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.

If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned.

(自http://www.cplusplus.com/reference/cstdio/scanf/?kw=scanf)

putchar()返回值的含义是:

On success, the character read is returned (promoted to an int value).
The return type is int to accommodate for the special value EOF, which indicates failure: (这句话极为重要,请反复阅读)
If the standard input was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stdin.
If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

(自http://www.cplusplus.com/reference/cstdio/getchar/?kw=getchar)

getchar()有一个隐藏的坑,极不容易发现:

for(char ch; ch=getchar(), ch!=EOF; ){
//...
}

先来看一下EOF的定义:

It is a macro definition of type int that expands into a negative integral constant expression (generally, -1).

It is used as the value returned by several functions in header <cstdio> to indicate that the End-of-File has been reached or to signal some other failure conditions.

It is also used as the value to represent an invalid character.

In C++, this macro corresponds to the value of char_traits<char>::eof().

----------------------------------------------------------------------------------------------------------

考虑表达式

ch = getchar()

char只有8位,这意味着,只有getchar()返回0(00)~255(FF)时,char才能完全接受。ASCII码只有7位 (0(00) ~ 127(7F)),存得下。

如果某个字符的编码为255(FF)(扩展ASCII码),EOF又恰好为-1,就无法区分EOF和这个字符,导致错误。

用scanf(“%c")就不会有这样的问题。

总之,

scanf("%c", &ch) == EOF

成立的话,一定是遇到的EOF,换作getchar()就不一定。

-------------------------------------------------------------------------------------------------------------------

ZOJ 3439是个极好的例子

这个坑爹的题目里有这样一句坑爹的话

" The test input just contains all one-byte characters."

getchar() 和 scanf("%c")的区别的更多相关文章

  1. C/C++ scanf和gets 区别 , printf和puts区别

    ref 1. scanf和gets区别 | 博客园 2. printf和puts区别 | CSDN scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢? scanf 留回车:开 ...

  2. getchar、scanf以及缓冲区的概念

      1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了.       getch()和getche( ...

  3. getchar与scanf区别

    scanf可以一次按照设定的输入格式输入多个变量数据.如int d,float f,char str[20],scanf("%d%f%s",d,f,str); getchar()只 ...

  4. getchar(),gets(),scanf()的差异比较

    scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets()函数. gets可以接收空格:而sc ...

  5. scanf gets fgets区别与联系 puts fputs printf区别与联系

    组一:scanf( )函数 gets( )函数    fgets()函数都可用于输入字符串, 组二:printf( )函数 puts( )函数 fputs()函数则用于字符串的输出. 两组内部函数各有 ...

  6. 【C语言】gets()和scanf()函数的区别

    scanf函数与gets函数 scanf函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets函数. gets ...

  7. getchar() 、 scanf() 、流与缓冲区

    C中的缓冲区一直是debug的重灾区,今天在写一个命令行界面的时候又遇到了这个问题,所以来总结一波. 两函数的不同之处 scanf() 会把 stdinBuff 中的特定格式数据取出,非特定格式数据则 ...

  8. C Language Study - gets , getchar &amp; scanf

    慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; ...

  9. scanf("%c\n",&a)和scanf("%c",&a)区别

    scanf("%c",&a); 当输入字符的时候,我们按下任意字符 + 回车的时候,回车没有被当作为分隔符,而是作为一个转义字符与输入的字符一起保存在缓存区.第一次scan ...

随机推荐

  1. 如何在Web服务器80端口上开启SSH服务

    本文所讨论的网络端口复用并非指网络编程中采用SO_REUSEADDR选项的 Socket Bind 复用.它更像是一个带特定路由功能的端口转发工具,在应用层实现. 背景 笔者所处网络中防火墙只开放了一 ...

  2. 利用ViewHolder优化自定义Adapter的典型写法

    1 public class MarkerItemAdapter extends BaseAdapter { private Context mContext = null; private List ...

  3. jQuery 遍历 - slice() 方法

    实例 选中所有段落,然后将所选内容缩减为只包含第一和第二个段落: $("p").slice(0, 2).wrapInner(""); 亲自试一试 定义和用法 s ...

  4. HMAC-MD5算法原理及实现

    以下是分析节选,对于更详细的描述可以查阅RFC2104文档.     HMAC需要一个加密用散列函数(表示为H)和一个密钥K. 假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数. 用B来表 ...

  5. Android EventBus源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  6. GSON

    { "data": [ { "children": [ { "id": 10007, "title": "北京 ...

  7. matlab中textread

    今天打算跑下程序,突然发现,真的很烂,不会读入数据,简单的Iris.txt一上午都没读进去,在此对matlab中的textread函数做下总结,textscan函数待续. 本文主要内容引自http:/ ...

  8. [CareerCup] 10.7 Simplified Search Engine 简单的搜索引擎

    10.7 Imagine a web server for a simplified search engine. This system has 100 machines to respond to ...

  9. Maven in 5 Minutes(Windows)

    这是根据官网的例子写的入门例子:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html 1)下载maven: ...

  10. nodeJs--模块module.exports与实例化方法;

    在nodejs中,提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.而在e ...