getchar() 和 scanf("%c")的区别

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."

时间: 2024-10-25 15:27:29

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

cin与getchar、scanf之间的区别

cin会忽略空格和回车 getchar与scanf不会忽略回车和空格 // exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; int main(void) { char ch; ch=getchar(); printf("%d\n",ch); cin>>ch; printf("%d\n",ch

输出与输出:putchar() getchar() printf() scanf() puts() gets() sscanf()

C语言中基本的输入输出函数有: putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程序变量中; puts ():把数组变量中的一个字符串常量输出到显示器屏幕上; gets ():从键盘上输入一个字符串常量并放到程序的数组中. sscanf(); 从一个字符串中提取各类数据.  putcha

getchar与scanf区别

scanf可以一次按照设定的输入格式输入多个变量数据.如int d,float f,char str[20],scanf("%d%f%s",d,f,str); getchar()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符. 如char ch;ch=getchar();输入abc\r(回车)ch=a;用在循环时也要等有回车键时才接收. char ch;while((ch=getchar())!='q'){printf("%c ",ch);

scanf gets fgets区别与联系

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用__gets__函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,应该使用gets输入.

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

scanf函数与gets函数 scanf函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,应该使

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

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets()函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束,并且回车键用‘\0’代替*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,

C/C++ scanf和gets 区别

ref https://www.cnblogs.com/hlongch/p/5742477.html scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢? scanf 留回车:开头忽略所有空格,以空格.制表符Tab(\r).换行符(\n)等结束,结尾自动加上'\0',并且这些字符会留在缓冲区中: gets 吃回车:开头接受任何字符,以换行符结束,并且会用'\0' 替换换行符作为字符串结尾. 相同点:字符串结尾自动加'\0' scanf和gets搭配混用时,需要注意是否接收

简要概括 getchar() 与 scanf() 的异同

C中的缓冲区一直是debug的重灾区,今天在写一个命令行界面的时候又遇到了这个问题,所以来总结一波. 不同: scanf() 会把 stdin 中的特定格式数据取出,非特定格式数据则会留在stdinBuff 中,比如 while(){ scanf("%c", ); } ,当你输入一个字符串+ 回车的时候,它会把按char类型取出每个字符,然后在把最后一个输入的 \n 留在stdinBuff 中;当你输入一个字符+回车,多次输入的时候,它会把每次输入中的\n都留在 stdinBuff 中

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

慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; char b[3]; scanf("%s%s",a,b); printf("%s\n%s",a,b); scanf使用%s接收字符串.可是并非每个输入的字符都会被当做字符串处理.空格.tab.换行.都会被残忍的拒绝,因此输入一串"带有空格的字符串"