C++字符读入函数(getch&getchar)

本文介绍了C++中用于字符读入的getch和getchar函数,对比了它们的区别和使用场景。getch来自conio.h,不等待回车并立即返回键值,不回显;getchar在cstdio中,需用户按回车后才读取并回显字符。两者在程序调试中各有应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于字符的读入,我们有scanf和cin这两个最为经典的函数,但是我们发现这两个函数写的都会比较麻烦或难看,而且耗费的时间复杂度较多。

而cstdio和conio.h头文件为了解决这个问题分别提供了两个函数——getch和getchar函数。

getch函数

所在头文件:conio.h

char ch = getch();

功能:getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回。输入的字符不会回显在屏幕上。getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行。

返回值:读入成功返回读取的字符。失败返回-1。

参数:无

getchar函数

所在头文件:cstdio

char ch = getchar();

功能:当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。并将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。

其实上下两行代码的意思是一样的

c = getchar();
scanf("%c", &c);

返回值:读入成功返回读取的字符。失败返回-1。

参数:无

运行实例

备注:getch与getchar的本质区别是只要键盘上某个按键被按下getch就返回,而getchar要等到有回车了开始读入。并且getch读入的字符是不显示在屏幕上的,而getcha是时显示的。

以下为代码

# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
# include <conio.h>
using namespace std;

# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)

int main()
{
	cout << "getch请输入一个字符:" << endl;
	char c = getch();
	cout << "读入的字符是" << c << endl; 
	
	cout << "===================================" << endl; 
	
	cout << "getchar请输入一个字符:" << endl;
	c = getchar();
	cout << "读入的字符是" << c << endl; 
	return 0;
}

God Bless You For Ever!

<think>我们正在讨论C语言中的输入函数:getch,getchar, fgetc。根据引用内容,我们可以总结如下: 1. **getch**:-不是C标准库函数,通常定义在<conio.h>中(在Windows环境下)。-直接从键盘读取一个字符,不等待回车(无缓冲输入),且输入的字符不会回显在屏幕上。-可移植性差,因为不是标准函数,在其他编译器或操作系统(如Linux)中可能不可用。-常用于程序调试,暂停程序运行,按任意键继续。2.**getchar**:-是C标准库函数,定义在<stdio.h>中。-从标准输入(stdin)读取一个字符,等待用户按回车(行缓冲输入)。-它实际上是通过宏定义实现的:`#define getchar()fgetc(stdin)`。-只读取一个字符,但用户可以输入多个字符,回车后程序继续,但getchar只取第一个字符。3.**fgetc**:-是C标准库函数,定义在<stdio.h>中。-从指定的流(stream)中读取一个字符。例如,从文件流或标准输入(stdin)读取。-当使用`fgetc(stdin)`时,其功能与`getchar()`相同。 此外,引用中还提到了其他函数如getche(与getch类似,但会回显字符)、getc(与fgetc功能相同,但通常由宏实现)、fgets(读取字符串,指定最大长度,安全)和gets(不安全的字符串输入函数,已被弃用)等,但问题主要关注getch、getchar和fgetc。 **主要区别总结**: |特性|getch|getchar| fgetc||--------------|----------------|----------------------|---------------------| |标准性|非标准|标准|标准| |头文件| conio.h| stdio.h| stdio.h||缓冲|无缓冲|行缓冲|行缓冲(当用于stdin)| |回显|无回显|有回显|有回显| |输入源|键盘|标准输入(stdin)|任意流(如文件、stdin)||等待回车|否|是(直到回车)|是(直到输入流中有数据)||可移植性|差|好|好| **使用示例**: -getch:常用于需要立即响应且不需要回显的场景,如密码输入(但通常有更好的替代方式)或调试暂停。 -getchar:用于从标准输入读取一个字符,常用于循环读取字符直到遇到换行或EOF。 -fgetc:用于从文件或标准输入读取字符,比getchar更通用。**注意**:由于getch不是标准函数,在非Windows系统上可能需要使用其他库(如ncurses)或系统调用实现类似功能。 根据引用[4],getch在调试时用于暂停程序运行,等待用户按键后继续。根据引用[2],getchar实际上是通过fgetc(stdin)实现的,因此两者在功能上等价。 因此,在可移植的程序中,应避免使用getch,而使用标准的getchar或fgetc。§§相关问题§§1.为什么说gets函数是不安全的?在C语言中用什么替代?2.如何用fgetc实现类似getch的无缓冲输入? 3.在Linux系统中如何实现类似于getch的功能?</think>### C语言中`getch`、`getchar`和`fgetc`函数区别 #### 1. **`getch`函数** - **非标准函数**:不属于C标准库,通常通过`<conio.h>`头文件提供(Windows环境)[^1][^4]。 - **输入行为**: - 直接从键盘读取字符,**无需按回车键**(无缓冲输入)。 - 输入字符**不回显**到屏幕(适用于密码输入等场景)。 - **返回值**:返回读取字符的ASCII码,出错时返回`-1`。 - **典型用途**:调试时暂停程序(按任意键继续)[^4]。 - **可移植性**:差,在其他编译器或操作系统(如Linux)中可能不可用[^1]。 #### 2. **`getchar`函数** - **标准函数**:属于C标准库,定义在`<stdio.h>`中[^2][^4]。 - **输入行为**: - 从**标准输入(stdin)** 读取**单个字符**,需按回车键结束输入(行缓冲)。 - 输入字符**回显**到屏幕。 - **实现机制**:通过宏定义为`#define getchar() fgetc(stdin)`[^2]。 - **返回值**:返回读取字符的ASCII码(`int`类型),出错或文件结尾返回`EOF`。 - **典型用途**:逐字符处理用户输入(如过滤换行符)。 #### 3. **`fgetc`函数** - **标准函数**:属于C标准库,定义在`<stdio.h>`中[^2]。 - **输入行为**: - 从**任意流(FILE*)** 读取单个字符(如文件、标准输入)。 - 与`getchar`类似,需等待输入完成(缓冲机制取决于流类型)。 - **返回值**:返回读取字符的ASCII码(`int`类型),出错或文件结尾返回`EOF`。 - **典型用途**:读取文件内容或通用字符输入。 #### 关键区别总结 | 特性 | `getch` | `getchar` | `fgetc` | |--------------|----------------|------------------|------------------| | **标准性** | ❌ 非标准 | ✅ 标准 | ✅ 标准 | | **头文件** | `<conio.h>` | `<stdio.h>` | `<stdio.h>` | | **输入源** | 键盘(直接) | 标准输入(stdin)| 任意流(FILE*) | | **缓冲机制** | 无缓冲 | 行缓冲 | 依赖流设置 | | **回显** | 无回显 | 有回显 | 有回显 | | **可移植性** | 差 | 高 | 高 | #### 示例代码 ```c // getchar 示例:读取并回显字符 #include <stdio.h> int main() { int c = getchar(); // 输入后需按回车 printf("Read: %c\n", c); return 0; } // fgetc 示例:从文件读取字符 #include <stdio.h> int main() { FILE *fp = fopen("file.txt", "r"); int c = fgetc(fp); // 从文件流读取 fclose(fp); return 0; } // getch 示例(Windows) #include <conio.h> #include <stdio.h> int main() { int c = getch(); // 按键后立即读取,无回显 printf("Key: %c\n", c); return 0; } ``` > **注意**:`getch`和`getche`(带回显版)应避免在需移植的程序中使用[^1]。对于字符串输入,优先选择`fgets`而非不安全的`gets`[^2][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值