首页 > C语言笔记

C语言getchar()和gets()的区别

在C语言中,getchar()gets() 都是用于从标准输入(通常是键盘)读取数据,但 getchar() 只能读取一个字符,而 gets() 可以读取一个字符串。

getchar() 函数

getchar() 是一个在C语言标准库 <stdio.h> 中定义的函数,它的主要作用是从标准输入流中读取单个字符。每次调用 getchar() 时,它会返回输入流中的下一个字符。


以下是 getchar() 的基本用法:

#include <stdio.h>

int main() {
    int ch;
    while ((ch = getchar()) != EOF) {
        putchar(ch);
    }
    return 0;
}

在这个例子中,程序会不断读取输入的字符,直到遇到文件结束符(EOF)。每读取一个字符,就立即将其打印出来。


getchar() 的特点:

gets() 函数

gets() 函数也定义在 <stdio.h> 中,用于从标准输入读取一行字符串。然而,需要特别注意的是,gets() 函数由于其固有的安全问题,在 C11 标准中已被废弃,并在后续版本中被移除。


尽管如此,了解 gets() 的工作原理仍然很有价值,因为它可以帮助我们理解字符串输入的基本概念,以及为什么它被认为是不安全的。


gets() 的基本用法(不推荐使用):

#include <stdio.h>

int main() {
    char str[100];
    gets(str);
    printf("You entered: %s\n", str);
    return 0;
}

gets() 的特点:

gets() 的替代方案

由于 gets() 的安全问题,现代C程序应该使用更安全的替代函数,如 fgets() 或者 gets_s() 或者scanf() 配合格式说明符%s使用。


使用 fgets() 的示例:

#include <stdio.h>

int main() {
    char str[100];
    if (fgets(str, sizeof(str), stdin) != NULL) {
        printf("You entered: %s", str);
    }
    return 0;
}

fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险。fgets() 会保留输入中的换行符(如果存在),这一点与 gets() 不同。

总结

getchar() 每次读取一个字符,而 gets() 读取整行字符串。getchar() 返回 int 类型,而 gets() 返回 char* 类型。getchar() 会读取所有字符包括空白字符,而 gets() 会读取直到遇到换行符,但不保存换行符。


如果需要逐字符处理输入,比如实现一个简单的文本过滤器,getchar() 是很好的选择。如果需要读取完整的文本行,比如处理用户输入的命令,那么 fgets() 会更适合。

相关文章