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() 的特点:
- 每次调用只读取一个字符。
- 返回值类型是 int,而不是 char,这是为了能够表示 EOF(通常定义为 -1)。
- getchar() 会读取所有字符,包括空白字符(如空格、制表符和换行符)。
- 通常与 putchar() 配对使用,用于字符的输入和输出。
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() 的特点:
- 读取整行输入,直到遇到换行符或 EOF。
- 会自动去掉输入中的换行符。
- 不进行边界检查,容易导致缓冲区溢出,因此被认为是不安全的。
- 无法指定最大读取长度,这是它最大的安全隐患。
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() 会更适合。