【C 语言基础】get四子——getc()、getchar()、getch() 和 getche() 的区别
简短不看版:
所有这些函数都从输入中读取一个字符并返回一个整数值。返回整数以容纳用于指示失败的特殊值。EOF值通常用于此目的。
- getc(FILE *) ,参数可以指定文件,也可以是标准输入stdin。
- getchar() 相当于 getc(stdin)
- getch() 和 getche() 从stdin 读取,但是不使用缓存。
C语言 get四子
1. getc()
它从给定的输入流中读取单个字符,并在成功时返回相应的整数值(通常是读取字符的ASCII值)。失败时返回EOF。
语法:
int getc(FILE *stream);
示例:
// Example for getc() in C
#include <stdio.h>
int main()
{
printf("%c", getc(stdin));
return(0);
}
输出:
Input: g (press enter key)
Output: g
2. getchar()
getc() 和 getchar() 之间的区别是 getc() 可以从任何输入流读取,但是 getchar() 只能从标准输入流读取。因此 getchar() 等价于 getc(stdin)。
语法:
int getchar(void);
示例:
// Example for getchar() in C
#include <stdio.h>
int main()
{
printf("%c", getchar());
return 0;
}
输出:
Input: g(press enter key)
Output: g
3. getch()
getch() 是一个非标准函数,存在于 conio.h 头文件中,该文件主要由 MS-DOS 编译器(如 Turbo C)使用。它不是 C 标准库或 ISO C 的一部分,也不是由 POSIX 定义的。
与上述函数一样,它也从键盘读取单个字符。 但它不使用任何缓冲区,因此输入的字符会立即返回,无需等待回车键。
语法:
int getch();
示例:
// Example for getch() in C
#include <stdio.h>
#include <conio.h>
int main()
{
printf("%c", getch());
return 0;
}
输出:
Input: g (Without enter key)
Output: Program terminates immediately.
But when you use DOS shell in Turbo C,
it shows a single g, i.e., 'g'
4. getche()
与 getch() 一样,这也是conio.h中的一个非标准函数。它从键盘读取单个字符,并立即显示在输出屏幕上,而无需等待回车键。
语法:
int getche(void);
示例:
#include <stdio.h>
#include <conio.h>
// Example for getche() in C
int main()
{
printf("%c", getche());
return 0;
}
输出:
Input: g(without enter key as it is not buffered)
Output: Program terminates immediately.
But when you use DOS shell in Turbo C,
double g, i.e., 'gg'
扩展:fgetc、getc与fputc、putc的功能与区别
fgetc与getc的功能
这两个函数的功能都是从指定的流中获取字符。
fgetc函数原型:int fgetc(FILE *stream)
getc函数原型: int getc(FILE *stream)
fputc与putc的功能
这两个函数的功能都是将指定的字符输入到指定的流中
fputc函数原型:int fputc(int c, FILE *stream)
putc函数原型:int putc(int c, FILE *stream)
其中c表示指定的字符对应的ASCII吗值,stream表示指定的流
区别
从表面上看,fgetc和getc的功能相同,fputc和putc的功能相同,那他们的区别在哪里呢?
注意:fgetc和fputc本质上函数,而getc和putc本质上是宏!
更细的区别有以下三个:
- 调用宏(getc、putc)时,宏的参数不能是有副作用的表达式。有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值,如++i。
- 函数可以获取其地址,并将其赋值给函数指针,而宏不可以获取地址。
- 调用宏的效率要高于调用函数。
转载参考
1. cnblogs: https://www.cnblogs.com/octobershiner/archive/2011/12/08/2281240.html
2 csdn: https://blog.csdn.net/weixin_43908419/article/details/128173476