C Get_函数不工作

C Get_函数不工作,c,mingw-w64,c11,gets,tr24731,C,Mingw W64,C11,Gets,Tr24731,我的书中说get_s()函数是get()函数的更好的替代方法,该函数已被弃用,不应使用。但是,当我尝试使用get_s()函数时,它总是给我一个错误: undefined reference to gets_s ,函数,我不太了解它在ISO/IEC 99中的定义。它不应该适用于所有的编译器吗?我很确定我使用的是MinGW编译器的最新版本 我应该如何使用此功能?使用gets()或scanf()(而不是scanf\u s()),或fgets()超过fgets\u s(),不好吗?是的,你是对的#大黄

我的书中说
get_s()
函数是
get()
函数的更好的替代方法,该函数已被弃用,不应使用。但是,当我尝试使用
get_s()
函数时,它总是给我一个错误:

undefined reference to gets_s

,函数,我不太了解它在
ISO/IEC 99
中的定义。它不应该适用于所有的编译器吗?我很确定我使用的是MinGW编译器的最新版本

我应该如何使用此功能?使用
gets()
scanf()
(而不是
scanf\u s()
),或
fgets()
超过
fgets\u s()
,不好吗?

是的,你是对的#大黄蜂 gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制stdin上显示内容的环境中运行)。因此,C99标准的第三个勘误表中不推荐使用该函数,而C11标准中完全删除了该函数。fgets()和get_s()是推荐的替换项。 永远不要使用get()

资料来源: 检查是否包含相应的标题。还有一件事你必须看到的是,你的c comiler版本是更新版本还是旧版本也会产生问题。。所以试试c11标准,或者c11在线编译器

是的,你是对的35;大黄蜂 gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制stdin上显示内容的环境中运行)。因此,C99标准的第三个勘误表中不推荐使用该函数,而C11标准中完全删除了该函数。fgets()和get_s()是推荐的替换项。 永远不要使用get()

资料来源:
检查是否包含相应的标题。还有一件事你必须看到的是,你的c comiler版本是更新版本还是旧版本也会产生问题。。因此,在大约90年代初的c11标准或c11在线编译器中尝试一下,
get()
被发现存在设计缺陷,因为它会一直读取数据,直到找到字符串的结尾,这意味着它可能会意外或通过安全漏洞导致缓冲区溢出

因此,
get
在C99标准中被标记为废弃函数。这意味着从1999年开始,人们被警告不应该使用它

该函数完全从C11标准中的语言中删除,这意味着有一个不少于12年的非常宽裕的过渡期来修复遗留代码。它被
gets\u s
取代,作为将旧代码移植到C11时使用的安全替代方案。它将缓冲区大小作为第二个参数

但是,
gets_s
仅应用于此类C11移植(如果有的话)
gets_s
是C11中可选边界检查接口的一部分,编译器不需要实现它。C11标准建议改用
fgets

推荐做法
fgets函数允许正确写入 用于安全处理输入行太长而无法存储在结果中的程序 数组。一般来说,这需要FGET的呼叫者注意 结果数组中是否存在新行字符。 考虑使用<强> fgs<强>(以及基于任何需要的处理) 新行字符)而不是获取\u s



请注意,
gets\u s
与非标准Visual Studio编译器几乎没有什么关系,即使该编译器恰好支持此功能,就像支持边界检查接口的标准一致性编译器(
\uu STDC\u LIB\u EXT1\uu
)一样。

在90年代初左右,
gets()
被发现存在设计缺陷,因为它会一直读取数据,直到找到字符串的结尾,这意味着它可能会意外或通过安全漏洞导致缓冲区溢出

因此,
get
在C99标准中被标记为废弃函数。这意味着从1999年开始,人们被警告不应该使用它

该函数完全从C11标准中的语言中删除,这意味着有一个不少于12年的非常宽裕的过渡期来修复遗留代码。它被
gets\u s
取代,作为将旧代码移植到C11时使用的安全替代方案。它将缓冲区大小作为第二个参数

但是,
gets_s
仅应用于此类C11移植(如果有的话)
gets_s
是C11中可选边界检查接口的一部分,编译器不需要实现它。C11标准建议改用
fgets

推荐做法
fgets函数允许正确写入 用于安全处理输入行太长而无法存储在结果中的程序 数组。一般来说,这需要FGET的呼叫者注意 结果数组中是否存在新行字符。 考虑使用<强> fgs<强>(以及基于任何需要的处理) 新行字符)而不是获取\u s



请注意,
gets\u s
与非标准Visual Studio编译器几乎没有关系,即使该编译器恰好支持此功能,正如支持边界检查接口的标准一致性编译器(
\uu STDC\u LIB\u EXT1\uuu
)所做的那样。

“它不应该与所有编译器一起工作吗?”。不,它不是标准的C函数。它是特定于Microsoft的,因此基本上需要Visual Studio。@kaylum,“ANSI C”与“特定于Microsoft的”标准不同吗?@kaylum,不了解这个sta可以吗