首页 > 编程笔记

C语言的getchar函数用法

C语言的 getchar 函数是一种用于从标准输入流(stdin)中获取字符的函数。在本文中,我们将介绍如何使用 getchar 函数以及一些常见的用法。

getchar 函数的语法如下:
int getchar(void);
该函数会从标准输入流中读取一个字符,然后返回该字符的 ASCII 码值。如果输入流已经结束(EOF),则返回 EOF 的值(通常是 -1)。

需要注意的是,getchar 函数每次只能读取一个字符。

下面是一个简单的示例程序,演示如何使用 getchar 函数:
#include <stdio.h>

int main() {
    int c;
    printf("请输入一个字符:");
    c = getchar();
    printf("您输入的字符是:%c\n", c);
    return 0;
}
在该程序中,我们使用了 printf 函数输出提示信息,然后调用 getchar 函数读取一个字符,最后使用 printf 函数输出该字符。运行该程序,我们可以得到如下结果:

请输入一个字符:A
您输入的字符是:A

接下来,我们将介绍一些常见的使用场景。

从文件中读取字符

除了从标准输入流中读取字符外,我们还可以使用 getchar 函数从文件中读取字符。为了演示这种用法,我们可以编写一个程序,从一个文本文件中读取字符,并统计其中的字母、数字和其他字符的数量。
#include <stdio.h>

int main() {
    int c, letter_count = 0, digit_count = 0, other_count = 0;
    FILE *fp = fopen("test.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件\n");
        return 1;
    }
    while ((c = getchar()) != EOF) {
        if (isalpha(c)) {
            letter_count++;
        } else if (isdigit(c)) {
            digit_count++;
        } else {
            other_count++;
        }
    }
    fclose(fp);
    printf("字母数量:%d\n", letter_count);
    printf("数字数量:%d\n", digit_count);
    printf("其他字符数量:%d\n", other_count);
    return 0;
}
在该程序中,我们使用 fopen 函数打开了一个名为 test.txt 的文本文件,然后使用 getchar 函数从该文件中读取字符。如果读取到的字符是字母,则将字母数量加 1;如果是数字,则将数字数量加 1;否则将其他字符数量加 1。最后,我们输出了统计结果。

需要注意的是,为了从文件中读取字符,我们使用了类似于标准输入流的方式,即在 while 循环中不断调用 getchar 函数。在循环内部,getchar 函数会从文件中读取一个字符,然后将该字符的 ASCII 码值赋值给变量 c。当读取到文件结尾(EOF)时,getchar 函数将返回 EOF 的值,导致 while 循环终止。

读取多个字符

如果我们想一次读取多个字符,可以使用一个 for 循环来调用 getchar 函数。例如,下面的程序可以读取用户输入的一行字符串,然后将该字符串转换为大写字母:
#include <stdio.h>
#include <ctype.h>

#define MAX_LENGTH 100

int main() {
    char str[MAX_LENGTH];
    int i;
    printf("请输入一行字符串:");
    for (i = 0; i < MAX_LENGTH - 1; i++) {
        int c = getchar();
        if (c == '\n' || c == EOF) {
            break;
        }
        str[i] = toupper(c);
    }
    str[i] = '\0';
    printf("转换后的字符串为:%s\n", str);
    return 0;
}
在该程序中,我们首先定义了一个长度为 100 的字符数组 str,用于存储用户输入的字符串。然后,我们使用一个 for 循环读取用户输入的字符,直到读取到换行符或文件结尾为止。在循环内部,我们将读取到的字符转换为大写字母,然后存储到字符数组 str 中。最后,我们在字符数组末尾添加一个空字符,以便将其作为字符串输出。

需要注意的是,我们在循环内部使用了 toupper 函数将读取到的字符转换为大写字母。toupper 函数是一个字符处理函数,用于将小写字母转换为大写字母。在本程序中,它的作用是将用户输入的字符串全部转换为大写字母。

运行该程序,我们可以得到如下结果:

请输入一行字符串:hello world
转换后的字符串为:HELLO WORLD

使用缓冲区

getchar 函数每次读取一个字符,这意味着在处理大量输入时,程序的效率可能会比较低。为了提高效率,我们可以使用缓冲区。缓冲区是一段内存空间,用于存储一定数量的数据,以减少 IO 操作的次数。

在 C语言中,标准输入流有一个缓冲区。当我们使用 getchar 函数从标准输入流中读取字符时,该字符实际上是从缓冲区中读取的。当缓冲区中没有足够的字符时,getchar 函数会自动将更多的数据从输入流中读取到缓冲区中。

下面是一个示例程序,演示了如何使用缓冲区来读取用户输入的整数:
#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    while (getchar() != '\n'); // 清空缓冲区
    printf("您输入的整数是:%d\n", num);
    return 0;
}
在该程序中,我们首先使用 scanf 函数读取用户输入的整数,然后使用一个 while 循环清空缓冲区。在循环内部,我们调用 getchar 函数读取缓冲区中的字符,直到读取到换行符为止。这是因为在用户输入完整数后,按下回车键会将一个换行符放入缓冲区中。如果我们不清空缓冲区,后续的输入函数(如gets、fgets等)可能会读取到该换行符,导致程序出错。

需要注意的是,上述程序中清空缓冲区的代码只适用于标准输入流。如果我们使用的是其他类型的流(如文件流或网络流),则需要使用不同的函数来清空缓冲区。

运行该程序,我们可以得到如下结果:

请输入一个整数:123
您输入的整数是:123

使用文件流

除了从标准输入流中读取输入,我们还可以从文件流中读取输入。在 C语言中,文件流是一种用于访问文件的抽象概念,可以通过文件指针来访问文件流。

下面是一个示例程序,演示了如何使用 fgetc 函数从文件流中读取字符:
#include <stdio.h>

#define FILENAME "test.txt"

int main() {
    FILE *fp;
    int c;
    fp = fopen(FILENAME, "r");
    if (fp == NULL) {
        printf("无法打开文件 %s\n", FILENAME);
        return 1;
    }
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
    fclose(fp);
    return 0;
}
在该程序中,我们首先使用 fopen 函数打开名为 test.txt 的文件,并将文件指针存储到变量 fp 中。如果文件打开失败,我们输出一条错误信息并返回程序错误码 1。

接下来,我们使用一个 while 循环调用 fgetc 函数从文件流中读取字符,直到读取到文件结尾为止。在循环内部,我们使用 putchar 函数将读取到的字符输出到屏幕上。

需要注意的是,我们在程序结束时使用 fclose 函数关闭文件指针,以释放系统资源。

运行该程序,我们可以得到如下结果(假设 test.txt 文件中包含了一行文本“Hello, world!”):

Hello, world!

总结

本文介绍了如何使用 C语言的 getchar 函数从标准输入流中读取输入,以及如何使用缓冲区和文件流进行输入操作。在实际编程中,我们需要根据具体需求选择不同的输入方法,并注意输入数据的类型和格式,以避免程序出错。

推荐阅读