最近在学习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值都是非负的。因此,很多时候,我们会写这样的两行代码:
这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):
二、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()的执行。
【补充】本文第二部分中关于EOF的总结部分,适用于终端驱动处于一次一行的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符 进行的。但是终端驱动处于一次一行的模式,它的输入只有到“\n”或者EOF时才结束,因此,终端上得到的输出也都是按行的。
如果要实现终端在读一个字符就结束输入的话,下面的程序是一种实现的方法(参考《C专家编程》,略有改动):
/*Edit by Godbach CU Blog: http://blog.chinaunix.net/u/33048/ */ #include <stdio.h> #include <stdlib.h>
int main(void) { int c; /* 终端驱动处于普通的一次一行模式 */ system("stty raw"); /* 现在的终端驱动处于一次一个字符模式 */ c = getchar(); putchar(); /* 终端驱动处又回到一次一行模式 */ system("stty cooked"); return 0; }
|
编译运行该程序,则当如入一个字符时,直接出处一个字符,然后程序结束。
由此可见,由于终端驱动的模式不同,造成了getchar()输入结束的条件不一样。普通模式下需要回车或者EOF,而在一次一个字符的模式下,则输入一个字符之后就结束了。
原文地址:http://blog.chinaunix.net/space.php?uid=10167808&do=blog&cuid=271120
分享到:
相关推荐
在C语言编程中,`getchar()`与`gets()`是两个常用函数,它们分别用于从标准输入流(通常是键盘)读取单个字符和整个字符串。虽然这两个函数都能从键盘接收输入,但它们的工作方式、应用场景以及潜在的风险存在很大...
### getchar函数和EOF详解 #### 一、getchar函数简介 在C语言中,`getchar()`函数主要用于从标准输入(通常为键盘)读取单个字符。此函数定义于`stdio.h`头文件中,并且它返回的是一个整型值,代表所读取的字符的...
在《C语言程序设计(第2版)-2期 常见问题5-4 使用getchar函数读取字符出现错误.pdf》中,我们看到了一个具体的问题:使用`getchar()`函数连续读取字符时可能会遇到的错误。为了解决这一问题,我们首先需要了解`...
本文将全面总结C语言中的文件操作函数,帮助你深入理解和掌握这些核心概念。 1. **文件操作的基础** - **文件流的概念**:在C语言中,文件被看作是字节流,我们通过`stdio.h`库中的函数来处理这些字节流。 - **...
scanf(), getchar(), 和gets()函数都是标准输入函数,它们在C语言中使用非常频繁,但是在实际应用中却常常因为使用不当而导致问题。下面我们将深入剖析scanf()、getchar()和gets()函数的异同,并探讨它们在读取字符...
C语言是一种广泛使用的...综上所述,本知识点总结的C语言函数速查表为初学者提供了学习C语言时的实用工具,使他们能够快速查找和理解各种基础函数的用途和用法,从而更好地掌握C语言,为后续的编程学习打下坚实的基础。
总结来说,`getchar()` 是 C 语言中用于从标准输入读取单个字符的重要工具,理解其工作原理和使用方法对于编写控制台交互式程序非常有帮助。在需要读取多字符输入时,可以灵活地使用 `fgets()` 等其他函数来实现。
下面将对C语言中常用的语句进行总结。 输出函数 1. putchar 函数:putchar 函数是一个字符输出函数,向终端输出一个字符。一般形式为:putchar(c) // 输出字符变量 c 的值。等同于 printf(“%c”,c)。 2. getchar...
本文通过对C语言中文件输入输出函数进行归纳总结,旨在帮助读者深入理解文件操作的原理,以及各种函数的具体使用方法。 首先,输入和输出的概念在编程中是相对的。从内存的角度看,数据从内存到文件的传输被认为是...
### C字符串函数总结 在C语言中,字符串的处理是一项重要的功能,被广泛应用于各种应用场景中。本文将根据所提供的信息,对C语言中涉及到的字符串处理进行深入解析,包括四个主要方面:字符处理库(ctype)、`stdio...
在这个C语言函数大全的CHM文件中,你可以找到关于C语言函数的详尽信息,包括函数的定义、参数、返回值、使用示例等,这对于学习和提升C语言编程技能非常有帮助。 在C语言中,函数是执行特定任务的代码块,它们可以...
C语言中,feof函数是一个用于检测是否到达...通过以上的分析和总结,我们能够更准确地理解和使用C语言中的`feof`函数,从而避免由于对`feof`函数误解而导致的编程错误。这对于编写可靠和高效的C语言程序是非常关键的。
- `getch()` 并非标准C语言中的函数,因此在使用时需要注意程序的可移植性问题。 - 在某些情况下,可以使用`getchar()`作为替代方案。 #### 四、注意事项 - 使用`conio.h`中的函数时,必须确保当前使用的编译环境...
在C语言程序设计中,数据输入是至关重要的一个环节,其中`scanf`和`getchar`函数是最常用的数据输入函数。下面将详细讲解这两个函数的使用及其特点。 首先,我们来看`scanf`函数。`scanf`是标准输入流的格式化输入...
在C语言中,`getchar()`函数用于从标准输入(通常是键盘)读取单个字符。这个函数在处理字符输入时扮演着重要角色,而EOF(End Of File)则是表示文件结束的特殊标记。本文将深入探讨这两个概念,并提供相关的编程...
本文将详细介绍C语言中的文件操作函数,并通过示例帮助理解这些函数的工作原理。 #### 二、文件操作函数分类 C语言中的文件操作函数大致可以分为以下几类: 1. **文件的打开**:`fopen()`。 2. **文件的关闭**:`...
本文将深入探讨C和C++的基本内置函数,包括其用途、用法以及在实际编程中的应用。 一、C语言内置函数 1. 输入/输出函数: - `printf` 和 `scanf` 是最常用的输入输出函数。`printf` 用于格式化输出,`scanf` 用于...
C语言是软件开发中最基础也是最重要的一部分,本文将对C语言中的常用语句进行总结,包括函数、基本语句、循环语句和其他语句等。 一、函数 1.putchar 函数:putchar 函数是一个字符输出函数,用于向终端输出一个...