本文目录一览:
c语言getchar的用法
许多初学者都习惯用 char
型变量接收 getchar
、getc
、fgetc
等函数的返回值,其实这么做是不对的,并且隐含着足以致命的错误。getchar()
最典型的程序也就几行代码而已。下面我们来看看 C 语言 getchar
的用法。
一、getchar 的两点总结:
- getchar 是以行为单位进行存取的。
当用
getchar
进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符 EOF,Windows 下为组合键 Ctrl+Z,Unix/Linux 下为组合键 Ctrl+D),那么只有当最后一个输入字符为换行符\n
(也可以是文件结束符 EOF)时,getchar
才会停止执行,整个程序将会往下执行。例如下面程序段:
while ((c = getchar()) != EOF) {
putchar(c);
}
执行程序,输入:abc
,然后回车。则程序就会去执行 putchar(c)
,然后输出 abc
,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。
对于 getchar
,肯定很多初学的朋友会问,getchar
不是以字符为单位读取的吗?那么,既然我输入了第一个字符 a,肯定满足 while
循环 (c = getchar()) != EOF
的条件,那么应该执行 putchar(c)
在终端输出一个字符 a。不错,我在用 getchar
的时候也是一直这么想的,但是程序就偏偏不这样执行,而是必须读到一个换行符或者文件结束符 EOF 才进行一次输出。
对这个问题的一个解释是,在大师编写 C 的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到 EOF(End 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
函数返回的所有可能的值,正确的定义方法如下(KR C 中特别提到了这个问题):
int c;
c = getchar();
二、EOF 的两点总结(主要指普通终端中的 EOF)
- 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 才相当于文件结束符。
- EOF 作为行结束符时的情况,这时候输入 Ctrl+D 并不能结束
getchar()
,而只能引发getchar()
提示下一轮的输入。 这种情况主要是在进行getchar()
新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入 Ctrl+D,此时的 Ctrl+D 并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc
,然后 Ctrl+D,程序输出结果为:
abc
abc
注意:第一组 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:
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c;
/* 终端驱动处于普通的一次一行模式 */
system("stty raw");
/* 现在的终端驱动处于一次一个字符模式 */
c = getchar();
putchar(c);
/* 终端驱动处又回到一次一行模式 */
system("stty cooked");
return 0;
}
编译运行该程序,则当输入一个字符时,直接输出一个字符,然后程序结束。
由此可见,由于终端驱动的模式不同,造成了 getchar()
输入结束的条件不一样。普通模式下需要回车或者 EOF,而在一次一个字符的模式下,则输入一个字符之后就结束了。
getchar 在 C 语言中是什么意思?
getchar
是读入函数的一种。它从标准输入里读取下一个字符,相当于 getc(stdin)
。返回类型为 int
型,为用户输入的 ASCII 码或 EOF。
它的作用是从 stdin
流中读入一个字符,也就是说,如果 stdin
有数据的话不用输入它就可以直接读取了,第一次调用 getchar()
时,确实需要人工的输入,但是如果输入了多个字符,以后的 getchar()
再执行时就会直接从缓冲区中读取了。
getchar 函数语法相关资料
- 函数声明
int getchar(void)
- 参数 NA
- 功能
C 库函数
int getchar(void)
从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于getc
带有 stdin 作为参数。 - 返回值 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
- 用法
该函数声明在
stdio.h
头文件中,使用的时候要包含stdio.h
头文件。例如:
#include <stdio.h>
int getchar(void);
c语言里getchar()是什么
getchar()
函数是 C 语言专门为输入单个字符而提供的,getchar()
函数是从 I/O 字符流中读取一个字符,必须输入换行才能读入字符。
例如:
#include <stdio.h>
int main(void) {
char ch;
int i;
for (i = 0; i < 5; i++) {
ch = getchar(); // 带回显,且等待按 Enter 键换行
printf("%c", ch);
}
return 0;
}
扩展资料:
getchar()、getche()、getch() 相比较
getchar()
函数是 C 语言专门为输入单个字符而提供的,getchar()
函数是从 I/O 字符流中读取一个字符,必须输入换行才能读入字符。getche()
、getch()
函数也是读入单个字符,是从控制台直接读取一个字符,无须换行即可读入字符。getchar()
是 C 的标准库函数,包含在头文件stdio.h
中。- 而
getche()
和getch()
需要的头文件是conio.h
。conio.h
不是 C 标准库中的头文件。conio
是 Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作。 getchar()
函数从键盘读入字符时,输入的字符带回显,并且必须等到输入换行(按 Enter 键)才能读取一个字符。getche()
函数从键盘读入字符时,输入的字符会回显到显示屏上,但是无须输入换行即可读取一个字符。getch()
函数从键盘读入字符时,输入的字符不回显到显示屏上,但是无须输入换行即可读取一个字符。