c - 关于 C 中的 gets()

标签 c arrays

我正在编写一个 C 程序,它有一个 5 元素数组来存储一个字符串。我正在使用 gets() 获取输入。当我输入超过 5 个字符然后输出字符串时,它只给了我输入的所有字符。我知道字符串以 \0 结尾,所以即使我超出了我的数组,它仍然会输出整个东西。

但我很好奇的是,gets() 到底在哪里存储输入,是缓冲还是直接进入我的数组?
如果我输入一个很长的字符串,gets() 会尝试将字符存储在不应该被触摸的内存中吗?它会给我一个段错误吗?

最佳答案

这就是为什么 gets 是一个邪恶。它不检查数组绑定(bind)并经常调用未定义的行为。切勿使用 gets,而是可以使用 fgets .
顺便说一句,现在 gets 不再是 C 的一部分。它已在 C11 标准中删除,取而代之的是新的安全替代方案,gets_s1(参见 wiki)。所以,最好忘记 gets


<子>1。 C11: K.3.5.4.1 gets_s 函数

概要

#define _ _STDC_WANT_LIB_EXT1_ _ 1
#include <stdio.h>
char *gets_s(char *s, rsize_t n);

关于c - 关于 C 中的 gets(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068526/

相关文章:

c - 没有循环的 Fork-Exec 炸弹

c - 段错误 - Strtok - Linux C

GtkWindow 改变时改变 GtkButton 颜色

c++ - CSocket::Send 是否存在性能问题?

python - 来自数组和 np.dtype 对象的结构化数组

javascript - 如何将字符串值转换为混合数组中的数字

java - 从另一个 Activity 编辑数组

c - 如何避免 linux 设备驱动程序中的 copy_from_user 和 copy_to_user

javascript - 在循环中用数组内容替换html中的字符串

java - 使用选择排序按字母顺序对数组进行排序