关于C语言中getchar()的详细使用

C语言——标准输入函数(scanf、getchar和gets) 标准输入函数(scanf、getchar和gets) 阅读详情

(此贴对自己受用,来源网络,在此分享)在C语言中有个重要的库函数getchar(),可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的在C语言中有个重要的库函数getchar(),可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的字符都会缓冲在键盘缓冲器中,直到回车换行一次性将所有字符按序依次赋给相应的变量,在这里一定要注意最后一个字符即'\n',该字符也会赋给一个相应的变量(当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以)。


  其实,getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux,在其他系统下也一样。


  一、getchar的两点总结:


  1.getchar是以行为单位进行存取的。


  当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符'\n'(也可以是文件结束符EOF,EOF将在后面讨论)时, getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:


  while((c = getchar()) != EOF){ putchar(c);}


  执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。


  对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。


  对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。


  2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。


  这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:


  char c;


  c = getchar();


  这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):


  int c;


  c = getchar();


  二、EOF的两点总结(主要指普通终端中的EOF)


  1.EOF作为文件结束符时的情况:


  EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。


  (1)遇到getchar函数执行时,要输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;


  (2)在前面输入的字符为换行符时,接着输入Ctrl+D;


  (3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的Ctrl+D的作用将在下面介绍。


  其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。


  2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。


  这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:


  abcabc


  注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。


  如果输入abc之后,然后回车,输入换行符的话,则终端显示为:


  abc         //第一行,带回车


  abc         //第二行


  //第三行


  其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。


  从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。


  EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。字符都会缓冲在键盘缓冲器中,直到回车换行一次性将所有字符按序依次赋给相应的变量,在这里一定要注意最后一个字符即'\n',该字符也会赋给一个相应的变量(当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以)。

  其实,getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux,在其他系统下也一样。

  一、getchar的两点总结:

  1.getchar是以行为单位进行存取的。

  当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符'\n'(也可以是文件结束符EOF,EOF将在后面讨论)时, getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:

  while((c = getchar()) != EOF){ putchar(c);}

  执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。

  对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

  对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

  2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。

  这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:

  char c;

  c = getchar();

  这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):

  int c;

  c = getchar();

  二、EOF的两点总结(主要指普通终端中的EOF)

  1.EOF作为文件结束符时的情况:

  EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。

  (1)遇到getchar函数执行时,要输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;

  (2)在前面输入的字符为换行符时,接着输入Ctrl+D;

  (3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的Ctrl+D的作用将在下面介绍。

  其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。

  2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。

  这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:

  abcabc

  注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。

  如果输入abc之后,然后回车,输入换行符的话,则终端显示为:

  abc         //第一行,带回车

  abc         //第二行

  //第三行

  其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。

  从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。

  EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。

C语言积累整理---getchar与putchar以及getch()getchar() 1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的后按回车键所致),所以如果不在此加一个 getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误 3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法: (1)使用下面的语句清除回车: while(getchar()!=’\n’); (2) 阅读详情

相关推荐

iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

作者最近在写项目的过程中遇到了一些3d模型格式问题,故写下这篇文章记录一下解决问题的过程。

yueliangmua的博客 5558

关于C语言getchar()函数的用法

关于C语言getchar()函数的用法

... 5万+

C++中getchar()使用方法

1 getchar()简介getchar()是C语言中的函数,C++中也包含了该函数。getchar()函数的作用是从标准的输入stdin中读取字符。也就是说,getchar()函数以字符为单位对输入的数据进行读取。2 getchar()读取缓冲区方式在控制台中通过键盘输入数据时,以回车键作为结束标志。当输入结束后,键盘输入的数据连同回车键一起被输入到输入缓冲区中。在程序中第一次调用getchar...

hou09tian的博客 13万+

getchar()用法

getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你...

qq_41179293的博客 4216

C语言 getchar()函数详解

getchar()函数机制 getchar()函数实际上是int getchar(void),所以它返回的是ASCII,所以只要是ASCII表里有的字符它都能读取出来。在调用getchar()函数时,编译器会依次读取用户键入缓存区的一个字符(注意这里只读取一个字符,如果缓存区有多个字符,那么将会读取上一次被读取字符的下一个字符),如果缓存区没有用户键入的字符,那么编译器会等待用户键入并回车后再执行下一步 (注意键入后的回车键也算一个字符,输出时直接换行)。 来几个例子: int main() { ch

Huang_WeiHong的博客 13万+

C语言getchar()函数的详解

getchar()函数的详解

weixin_64182409的博客 3万+

C语言getchar() 和 putchar() 的用法

C语言getchar() 和 putchar() 的用法 getchar() 和 putchar() 是一对字符输入/输出函数. getchar()不带任何参数,他从输入序列中返回下一个字符。例如,下面的语句读取下一个字符输入,并把该字符的赋给变量ch: ch = getcha(); putchar()函数打印它的参数。例如,下面的语句把之前赋给ch的作为字符打印出来: putchar(ch); 由于这两个函数只处理字符,所以他们通常比scanf() 和printf() 函数更快更便捷。而且,ge

Luo_LA的博客 8万+

[C语言][总结] getchar()清除缓冲区

getchar()是最近看C语言教程看到的函数,大三的时候学C语言吊儿郎当,隐约听过老师说过这个函数,似乎与清除缓冲区有关,今天终于彻底了解了。 A.getchar()使用 看一段代,它实现的功能是输出我们输入的字母: 输入a,它输出a。这里getchar()的功能是获取键盘输入的字母,搭配putchar()来进行一个输出。 来看看while语句括号内的内容: ch=getchar(),这个ch在此前声明为int类型,而我们输入的a是字符,看起来出现了矛盾。其实原因是:getchar()

matlabgreenman的博客 6401

C语言 getchar()原理及易错点解析

文章目录一.getchar()系列1.getchar()工作原理及作用2.使用getchar()清理回车\n3.使用getchar()清理缓存 一.getchar()系列 1.getchar()工作原理及作用 工作原理:getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,...

Kevin.wang 6万+

C语言getchar()函数解析

1.首先getchar()函数包含在#include<stdio.h>中,请看下面的例子: 下面是C程序的基本结构请自己动手编写试试,不要眼高手低。 /*std是standard单词的缩写,标准的意思,i是input单词的缩写输入的意思,o是output单词的缩写, 输出的意思连起来读就是标准输入输出。 */ #include<stdio.h> int main(void) //主函数,一个C程序有且只有一个主函数 { char a; a=getchar(); //切记

L1965314411的博客 4346

C语言丨getch(),getche()getchar()的区别

关于C语言中的getch(),getchar() getche()函数肯定十分困扰大家,今天将他们整理和大家一起分享. 1、getchar() 函数名:getchar() 头文件:stdio.h 功 能:读取控制台输入的字符,并保存在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。 原 型:int getchar(void); 例如: #include <stdio.h> int main(void) { printf("%c\n", getchar...

Hsuesh的博客 3693

C语言getchar()和putchar()函数

1、getchar()和putchar()函数的定义。2、getchar()函数为什么用int定义返回类型。3、函数getchar()和函数scanf()的工作原理。 一、getchar()和putchar()函数的定义。getchar()和putchar()是一对字符输入/输出函数。getchar()不带任何参数,getchar()用于读取用户从键盘输入的单个字符。putchar()向终端输出一个字符,其格式为putchar()getchar()和putchar()函数包含在头文件stdio.h中,使

m0_73067372的博客 8852

一文搞定C语言中的getchar()和putchar()用法

欢迎大家与我一起学习和提高,希望此文能帮助您。 getchar()和putchar()是输入输出类函数,调用他们时需要引用头文件#include <stdio.h>,**getchar()**用于读取用户从键盘输入的单个字符,读取正确会返回一个整型,即字符的ASCII,读取错误会返回-1;得注意的是getchar()首次被调用时会让你从键盘输入字符或字符串(输入数字也会被转化成字符),然后按下回车,这有一个大家容易忽略的点,就是回车这个字符‘\n’,也会存储在键盘缓冲区中,下面会给例子;

m0_55283616的博客 6784

c语言getchar()

c语言getchar()的用法: 1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误 3.getchar()是在输入缓冲区顺序读入一个字符(包括...

zhangvalue的博客 866

【C语言入门】getchar()深度解析

getchar()是 C 标准库中用于从标准输入流(stdin)读取单个字符的函数,其函数原型定义在头文件<stdio.h>函数名getchar(get character 的缩写,意为 “获取字符”)。参数:无(void表示无参数)。返回:读取成功时返回读取的字符(以int类型表示);遇到文件结束(EOF)或错误时返回EOF(通常定义为 - 1)。getchar()getchar()就像一个 “一次只取一个字符的快递员”,用int盒子给你递字符;如果没字符了或出问题,就递 - 1(EOF)。

Mr_-G,一名勤奋底层软件开发工程师的博客 2805

C语言入门:getchar()深度解析

getchar()是 C 标准库中用于从标准输入流(stdin)读取单个字符的函数,其函数原型定义在头文件<stdio.h>函数名getchar(get character 的缩写,意为 “获取字符”)。参数:无(void表示无参数)。返回:读取成功时返回读取的字符(以int类型表示);遇到文件结束(EOF)或错误时返回EOF(通常定义为 - 1)。getchar()getchar()就像一个 “一次只取一个字符的快递员”,用int盒子给你递字符;如果没字符了或出问题,就递 - 1(EOF)。

Mr_-G,一名勤奋底层软件开发工程师的博客 3190

C语言积累整理---getchar()用法

(1)getchar()用法 1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误 3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法: (1)使用下面的语句清除回车:

weixin_42682108的博客 3098

C语言 getchar()

C语言 getchar() getchar()函数的作用是从计算机终端(一般为键盘)获取一个无符号字符。getchar()函数只能接收一个字符,其函数就是从输入设备获取到的字符。 功能 C 库函数int getchar(void)从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于getc带有 stdin 作为参数。 返回 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。 用法 该函数声明在stdio.h头文件中,使用的时候

qq_45743113的博客 590

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1625

合同管理系统新版,合同管理系统免费版,Java

5实现公司企业合同信息的管理、查询、记录、合同分析等等功能

上一篇: 改写小游戏
下一篇: 扩展函数
Dormant7
博客等级 码龄13年 56粉丝 5原创
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值