C getchar 函数
最后修改日期:2025 年 4 月 6 日
字符输入是 C 编程的一个基本方面,它允许通过控制台与用户进行交互。getchar 函数提供了一种从标准输入读取单个字符的简单方法。本教程将深入探讨 getchar,解释其行为并演示各种用例。掌握字符输入有助于构建交互式程序和高效的数据处理例程。
什么是 getchar?
getchar 函数从标准输入 (stdin) 读取单个字符并将其作为 int 返回。如果缓冲区为空,它会等待用户输入,并在按下 Enter 键后继续。在发生错误或文件结束条件时,该函数返回 EOF。由于它返回的是 int,因此必须正确处理类型才能正确检测 EOF。getchar 定义在 stdio.h 头文件中。
基本字符输入
此示例演示了 getchar 读取和显示单个字符的最简单用法。
#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 中,以容纳 EOF。putchar 输出该字符,后跟一个换行符。请注意,输入缓冲区中可能还剩其他字符。
读取多个字符
此示例显示了如何读取多个字符直到按下 Enter 键。
#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 信号。
#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 如何处理无限输入流。
带修改的输入回显
此示例读取输入并将其回显,将所有小写字母转换为大写字母。
#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 进行实时输入转换。
带星号的密码输入
此示例演示了如何实现密码输入,该输入显示星号而不是实际字符。
#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 进行单字符输入来实现基本的菜单系统。
#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 语句处理有效的选项。这种模式对于简单的基于控制台的界面很有用。
读取直到特定字符
此示例读取输入,直到遇到特定的分隔符字符。
#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 的最佳实践
- 为存储使用 int: 始终将
getchar的返回值存储在int中,以正确处理EOF。 - 清除输入缓冲区: 读取单个字符后,清除剩余的输入以防止意外行为。
- 检查 EOF: 在循环中始终包含 EOF 检查,以处理意外的输入终止。
- 与其他函数结合使用: 将
getchar与putchar结合使用以实现高效的字符 I/O。 - 考虑缓冲: 请记住,输入通常是行缓冲的,需要按下 Enter 才能提交字符。
来源
本教程通过从基本输入到高级应用的实际示例,探讨了多功能的 getchar 函数。掌握字符输入对于构建交互式 C 程序和高效处理文本数据至关重要。
作者
列表 C 标准库。