C语言 - getchar() 和 getch() 的区别

getchar()getch() 都是用于 读取单个字符 的函数,但它们有一些关键区别,主要涉及 缓冲区、回显移植性


1. getchar()

特点

  • 头文件#include
  • 从标准输入(stdin)读取一个字符,需要 按下 Enter 才能生效
  • 带缓冲(Buffered):用户输入的内容会先存入缓冲区,只有按下 Enter 之后,getchar() 才会从缓冲区读取数据。
  • 回显(Echo):输入的字符会显示在屏幕上。

代码示例

#include 

int main() {
    char ch;
    printf("请输入一个字符(需要按 Enter 结束):");
    ch = getchar();  // 读取一个字符
    printf("\n你输入的字符是:%c\n", ch);
    return 0;
}

运行示例

请输入一个字符(需要按 Enter 结束):A
你输入的字符是:A

说明:

  • 这里 输入 A 之后,必须按下 Entergetchar() 才会读取字符。
  • 输入缓存行为
    • 用户输入 ABC + Enter,则 getchar() 只读取 A,剩余 BC 仍留在输入缓冲区,后续 getchar() 调用可继续读取。

2. getch()

特点

  • 头文件#include (⚠️ 仅 Windows / DOS 支持,Linux 需 ncurses
  • 直接读取单个字符无需按 Enter,一旦按下键就立即生效。
  • 无缓冲(Unbuffered):字符不会存入输入缓冲区。
  • 无回显(No Echo):输入的字符不会显示在屏幕上。

代码示例

#include 
#include   // Windows 下的 getch() 需要此头文件

int main() {
    char ch;
    printf("请按下一个字符(不需要按 Enter):");
    ch = getch();  // 直接获取字符,无需按 Enter
    printf("\n你输入的字符是:%c\n", ch);
    return 0;
}

运行示例

请按下一个字符(不需要按 Enter):A
你输入的字符是:A

说明:

  • 一旦按下 A,立即读取,无需按 Enter,程序不会等待回车。
  • 屏幕不会显示 A,因为 getch() 不会自动回显,但 printf() 仍然会输出它。

3. getchar() vs. getch()

区别点 getchar() getch()
头文件 (Windows 专用)
输入缓冲 有缓冲(必须按 Enter 才能读取) 无缓冲(立即读取)
回显 有回显(输入的字符会显示在屏幕上) 无回显(输入的字符不会显示)
是否需回车 需要(必须按 Enter 才读取) 不需要(按键即读取)
可移植性 跨平台(Windows/Linux/macOS 通用) 仅 Windows/DOS(Linux 需 ncurses
典型用途 适用于 普通文本输入 适用于 游戏、密码输入、菜单操作

相关链接:C语言 - getchar() 的缓冲区问题,不推荐使用fflush(stdin):https://blog.csdn.net/weixin_52631945/article/details/146392532

4. getch() 在 Linux 下的替代方案

Linux 下 没有 getch(),但可以用 termios 实现类似功能:

#include 
#include 
#include 

// Linux 下实现类似 getch() 的函数
char getch() {
    struct termios oldt, newt;
    char ch;

    tcgetattr(STDIN_FILENO, &oldt);  // 获取终端当前设置
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);  // 关闭缓冲与回显
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);  // 应用新设置

    ch = getchar();  // 读取单个字符

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);  // 还原终端设置
    return ch;
}

int main() {
    printf("请按下一个字符(不需要按 Enter):");
    char ch = getch();  // 直接获取字符
    printf("\n你输入的字符是:%c\n", ch);
    return 0;
}

5. 适用场景

使用场景 推荐函数
需要标准输入,支持回车确认 getchar()
需要即时输入,不想按回车 getch()
需要隐藏输入(如密码) getch()(+ printf("\b*") 覆盖回显)
跨平台兼容(Linux & Windows) getchar()(或 termios 实现 getch()

总结

  • getchar():标准输入函数,需要按 Enter有回显有缓冲跨平台
  • getch()立即读取字符无回显无缓冲仅 Windows(Linux 需特殊处理)

如果你希望 即时读取字符(如游戏、键盘监听),用 getch()
如果你希望 用户输入完整内容(如普通文本输入),用 getchar()

(完)

你可能感兴趣的:(c语言,算法)