getchar c语言

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 C语言 正文

getchar() 是 C 标准库 <stdio.h> 中的一个非常重要的函数,用于从标准输入流(通常是键盘)读取一个字符。

getchar c语言
(图片来源网络,侵删)

函数原型

int getchar(void);

关键点:

  • 返回类型是 int,而不是 char:这是一个非常重要的细节。getchar() 返回的不仅仅是字符本身,它返回的是一个整型值。

    • 如果成功读取,它会返回读取到的字符的 ASCII 码值(可以安全地赋给一个 char 类型变量)。
    • 如果到达文件末尾(End-of-File,EOF),或者发生读取错误,它会返回一个特殊值 EOFEOF 通常被定义为 -1,使用 int 类型可以确保 EOF 这个值能够被正确返回,而不会与一个合法的字符值混淆。
  • 参数是 void:表示该函数不接受任何参数。


工作原理

getchar() 的工作流程如下:

getchar c语言
(图片来源网络,侵删)
  1. 程序调用 getchar()
  2. getchar() 会等待用户从键盘输入一个字符并按下 Enter 键。
  3. 用户输入的字符会被放入一个名为输入缓冲区 的区域。
  4. getchar() 从缓冲区中取出第一个字符,并将其返回。
  5. 注意:按下 Enter 键产生的换行符 \n 也会被留在缓冲区中,等待下一次 getchar() 读取。

一个简单的例子

这个例子从键盘读取一个字符,然后将其打印出来。

#include <stdio.h>
int main() {
    int c; // 必须使用 int 类型来接收 getchar() 的返回值
    printf("请输入一个字符,然后按回车键: ");
    // 调用 getchar() 读取一个字符
    c = getchar();
    // 将读取到的字符打印到标准输出(屏幕)
    printf("你输入的字符是: ");
    putchar(c); // putchar() 是输出一个字符的函数
    printf("\n");
    return 0;
}

如何编译和运行:

  1. 将代码保存为 getchar_example.c
  2. 编译:gcc getchar_example.c -o getchar_example
  3. 运行:./getchar_example
  4. 程序会提示你输入,你输入一个字符(A)并按回车,程序就会输出你输入的字符。

经典用法:读取一行输入

getchar() 最常见的用法是配合 while 循环来读取用户输入的一整行,直到遇到换行符 \n 或者文件结束符 EOF

示例:回显用户输入的所有字符,直到遇到换行符。

getchar c语言
(图片来源网络,侵删)
#include <stdio.h>
int main() {
    int c;
    printf("请输入一行文本,按回车结束:\n");
    // 循环读取字符,直到遇到换行符 '\n'
    while ((c = getchar()) != '\n') {
        putchar(c); // 将读取到的字符原样打印出来
    }
    printf("\n程序结束,\n");
    return 0;
}

代码解释:

  • while ((c = getchar()) != '\n') 这是一个非常经典的 C 语言写法。
    • c = getchar():先调用 getchar() 读取一个字符,并将其赋值给变量 c
    • c = getchar() != '\n':整个表达式的值是赋值后 c 的值。
    • 循环会一直持续,只要 getchar() 读取到的字符不是换行符 \n
  • 当用户按下回车键时,\n 被读入,条件 c != '\n' 为假,循环结束。

处理文件结束符

在 Linux 和 macOS 终端中,你可以通过按下 Ctrl+D 来发送 EOF 信号,在 Windows 命令提示符中,则是 Ctrl+Z 然后回车。

示例:读取输入直到遇到 EOF。

#include <stdio.h>
int main() {
    int c;
    printf("请输入一些文本,按下 Ctrl+D (Linux/macOS) 或 Ctrl+Z (Windows) 结束输入:\n");
    // 循环读取字符,直到遇到文件结束符 EOF
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    printf("\n检测到 EOF,程序结束,\n");
    return 0;
}

代码解释:

  • while ((c = getchar()) != EOF):这个循环会一直读取并打印字符,直到 getchar() 返回 EOF
  • 这是一个非常强大的模式,因为它可以处理来自任何输入源的数据,无论是键盘、文件还是其他管道,而不仅仅是键盘输入。

重要注意事项

a. 缓冲区问题

getchar() 从缓冲区读取数据,如果你在调用 getchar() 之前使用了 scanf() 或其他类似的函数,可能会在缓冲区中留下不需要的字符(\n),这会影响后续的 getchar() 调用。

问题示例:

#include <stdio.h>
int main() {
    int age;
    char name_initial;
    printf("请输入你的年龄: ");
    scanf("%d", &age); // 用户输入 "25" 并回车
    printf("请输入你的姓名首字母: ");
    name_initial = getchar(); // 问题在这里!getchar() 直接读取了回车符 '\n'
    printf("年龄: %d\n", age);
    printf("姓名首字母: %c\n", name_initial); // 输出的是一个换行符,而不是你期望的字母
    return 0;
}

如何解决?

scanf() 之后,你可以清空输入缓冲区,一个简单的方法是循环读取并丢弃字符,直到遇到换行符。

// 在上面的代码中,scanf 之后加上这个循环
while (getchar() != '\n'); // 读取并丢弃所有字符,直到遇到换行符

b. getchar() 的性能

getchar() 是一个函数调用,每次调用都有一定的开销,在需要高性能读取大量字符的场景(编写一个简单的文本编辑器或解析器时),频繁调用 getchar() 可能会成为性能瓶颈,这时,可以考虑使用更底层的、非标准的函数,如 getche()(立即回显)或 getch()(不回显),但这会降低代码的可移植性。


特性 描述
头文件 #include <stdio.h>
原型 int getchar(void);
功能 从标准输入(键盘)读取一个字符。
返回值 成功时返回字符的 ASCII 码(int 类型),失败或到达文件末尾时返回 EOF(通常是 -1)。
缓冲区 读取的是输入缓冲区中的字符,通常需要按下回车键才会将输入送入缓冲区。
常见用途 读取单个字符。
配合 while 循环读取一行或直到 EOF
注意事项 必须用 int 类型变量接收返回值。
注意与 scanf() 等函数混用时可能产生的缓冲区问题。

getchar() 是 C 语言中进行字符级输入的基础,掌握它的用法对于编写交互式程序和进行底层输入处理至关重要。

-- 展开阅读全文 --
头像
原创织梦新闻网站模板有何独特优势?
« 上一篇 03-01
织梦表单如何精准获取来源网址?
下一篇 » 03-01

相关文章

取消
微信二维码
支付宝二维码

目录[+]