ZetCode

C getchar 函数

最后修改日期:2025 年 4 月 6 日

字符输入是 C 编程的一个基本方面,它允许通过控制台与用户进行交互。getchar 函数提供了一种从标准输入读取单个字符的简单方法。本教程将深入探讨 getchar,解释其行为并演示各种用例。掌握字符输入有助于构建交互式程序和高效的数据处理例程。

什么是 getchar?

getchar 函数从标准输入 (stdin) 读取单个字符并将其作为 int 返回。如果缓冲区为空,它会等待用户输入,并在按下 Enter 键后继续。在发生错误或文件结束条件时,该函数返回 EOF。由于它返回的是 int,因此必须正确处理类型才能正确检测 EOFgetchar 定义在 stdio.h 头文件中。

基本字符输入

此示例演示了 getchar 读取和显示单个字符的最简单用法。

basic_getchar.c
#include <stdio.h>

int main() {
    int c;  // Must be int to hold EOF
    
    printf("Enter a character: ");
    c = getchar();  // Read one character
    
    printf("You entered: ");
    putchar(c);  // Display the character
    printf("\n");
    
    return 0;
}

程序提示用户输入一个字符。getchar 读取 stdin 中的第一个字符,包括 Enter 键。该字符存储在 int c 中,以容纳 EOFputchar 输出该字符,后跟一个换行符。请注意,输入缓冲区中可能还剩其他字符。

读取多个字符

此示例显示了如何读取多个字符直到按下 Enter 键。

multi_getchar.c
#include <stdio.h>

int main() {
    int c;
    
    printf("Type several characters (press Enter to finish): ");
    
    while ((c = getchar()) != '\n' &&  c != EOF) {
        printf("Read: ");
        putchar(c);
        printf("\n");
    }
    
    return 0;
}

循环继续读取字符,直到遇到换行符 (\n) 或 EOF。每个字符在读取后都会立即处理。Enter 键生成终止循环的换行符。这种方法可以有效地处理可变长度的输入。请始终检查 EOF 以防止无限循环。

计算字符数

此程序计算用户输入的字符数,直到发出 EOF 信号。

count_chars.c
#include <stdio.h>

int main() {
    int c;
    long count = 0;
    
    printf("Enter text (Ctrl+D/Ctrl+Z to end):\n");
    
    while ((c = getchar()) != EOF) {
        count++;
    }
    
    printf("Character count: %ld\n", count);
    return 0;
}

程序初始化一个计数器,并进入一个循环,直到 EOF。在类 Unix 系统上,EOF 由 Ctrl+D 触发;在 Windows 上,使用 Ctrl+Z。每个有效字符都会使计数器加一。将显示最终计数。这演示了 getchar 如何处理无限输入流。

带修改的输入回显

此示例读取输入并将其回显,将所有小写字母转换为大写字母。

echo_upper.c
#include <stdio.h>
#include <ctype.h>

int main() {
    int c;
    
    printf("Enter text (Ctrl+D/Ctrl+Z to end):\n");
    
    while ((c = getchar()) != EOF) {
        if (islower(c)) {
            c = toupper(c);
        }
        putchar(c);
    }
    
    return 0;
}

程序在读取每个字符后立即处理它。islower 函数检查小写字母,然后使用 toupper 进行转换。然后使用 putchar 输出所有字符。这演示了使用 getchar 进行实时输入转换。

带星号的密码输入

此示例演示了如何实现密码输入,该输入显示星号而不是实际字符。

password_input.c
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

void disable_echo() {
    struct termios t;
    tcgetattr(STDIN_FILENO, &t);
    t.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &t);
}

void enable_echo() {
    struct termios t;
    tcgetattr(STDIN_FILENO, &t);
    t.c_lflag |= ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &t);
}

int main() {
    int c;
    char password[50];
    int i = 0;
    
    printf("Enter password: ");
    disable_echo();
    
    while ((c = getchar()) != '\n' &&  c != EOF &&  i < 49) {
        password[i++] = c;
        printf("*");
    }
    
    password[i] = '\0';
    enable_echo();
    printf("\nPassword entered: %s\n", password);
    
    return 0;
}

这个高级示例使用终端控制来禁用字符回显。getchar 读取的每个字符都存储在缓冲区中,同时显示一个星号。输入完成后将恢复回显。请注意,这使用了特定于 Unix 的终端控制函数。Windows 版本将需要不同的系统调用。

简单的菜单系统

此示例使用 getchar 进行单字符输入来实现基本的菜单系统。

menu_system.c
#include <stdio.h>

void display_menu() {
    printf("\nMenu:\n");
    printf("1. Option One\n");
    printf("2. Option Two\n");
    printf("3. Option Three\n");
    printf("Q. Quit\n");
    printf("Enter choice: ");
}

int main() {
    int c;
    
    while (1) {
        display_menu();
        c = getchar();
        
        // Clear input buffer
        while (getchar() != '\n' &&  getchar() != EOF);
        
        switch (c) {
            case '1':
                printf("Option One selected\n");
                break;
            case '2':
                printf("Option Two selected\n");
                break;
            case '3':
                printf("Option Three selected\n");
                break;
            case 'Q':
            case 'q':
                printf("Quitting...\n");
                return 0;
            default:
                printf("Invalid choice\n");
        }
    }
}

程序显示一个菜单并等待单字符输入。额外的 while 循环清除输入缓冲区中剩余的任何字符(包括换行符)。switch 语句处理有效的选项。这种模式对于简单的基于控制台的界面很有用。

读取直到特定字符

此示例读取输入,直到遇到特定的分隔符字符。

read_until.c
#include <stdio.h>

int main() {
    int c;
    char delimiter = ';';
    
    printf("Enter text (end with '%c'):\n", delimiter);
    
    while ((c = getchar()) != delimiter &&  c != EOF) {
        putchar(c);
    }
    
    printf("\nEnd of input reached.\n");
    return 0;
}

程序读取并回显字符,直到找到指定的分隔符(本例中为分号)。当遇到分隔符或 EOF 时,循环终止。此技术可用于解析分隔的输入或处理数据的特定部分。

使用 getchar 的最佳实践

来源

C getchar 文档

本教程通过从基本输入到高级应用的实际示例,探讨了多功能的 getchar 函数。掌握字符输入对于构建交互式 C 程序和高效处理文本数据至关重要。

作者

我叫 Jan Bodnar,是一名敬业的程序员,对编码充满热情。自 2007 年以来,我通过 1,400 多篇文章和 8 本电子书分享了我的专业知识。凭借十多年的教学经验,我努力使编程变得易于理解和引人入胜。

列表 C 标准库