gets

gets

learn/c

get

gets 是一个 C 语言中的函数,用于从标准输入(通常是键盘)读取一行文本。它的原型如下: c 复制代码 char *gets(char *str); gets 函数将读取输入直到遇到换行符(‘\n’),然后将读取的文本存储在参数 str 指向的字符数组中。它会在存储文本之前将换行符替换为字符串结束符(‘\0’)。 然而,需要注意的是,gets 函数是不安全的,因为它不检查目标缓冲区的大小,这可能导致缓冲区溢出。缓冲区溢出是一种严重的安全问题,可以被攻击者利用来执行任意代码或导致程序崩溃。 因此,不推荐使用 gets 函数,而应该使用更安全的替代函数,如 fgets。 下面是一个使用 fgets 函数的示例:

PLAINTEXT
1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
fgets(str, sizeof(str), stdin); // 使用 fgets 替代 gets
printf("You entered: %s", str);
return 0;
}

在上述示例中,fgets 函数接受三个参数:目标缓冲区、缓冲区的大小以及输入流(在这里是标准输入 stdin)。这样可以确保读取的文本不会超过缓冲区的大小,从而避免了缓冲区溢出的风险。

get_s

gets_s 是一个在 C 语言中用于从标准输入(通常是键盘)读取字符串的安全函数。它与传统的 gets 函数类似,但提供了额外的安全特性,以防止缓冲区溢出等安全问题。 gets_s 函数的形式如下: gets_s(words, STLEN); 其中,words 是目标字符数组,用于存储输入的字符串;STLEN 是目标数组的大小。 与 gets 函数相比,gets_s 具有以下区别和特性:

只从标准输入中读取数据,因此不需要第三个参数。 如果读到换行符,会丢弃它而不是存储它。 如果在读取最大字符数之前都没有读到换行符,gets_s 会执行一系列操作来保护缓冲区。它会将目标数组的首字符设置为空字符,并读取并丢弃随后的输入直到读到换行符或文件结尾。然后,返回空指针。此外,它还可能调用依赖实现的处理函数,可能会导致程序中止或退出。

需要注意的是,尽管 gets_s 函数相对安全,但仍需谨慎使用。确保正确设置目标数组的大小,并遵循最佳实践来避免潜在的安全问题。