gets函数在何种情况下能够使用

本文探讨了gets函数的历史变迁,从C99标准到C14标准中被完全移除的过程,以及在不同C标准版本下使用该函数时遇到的警告与错误。通过示例程序演示了从C98到C17各版本编译器对gets函数的不同反应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于gets函数:

gets函数是一个很有争议的函数,因为它存活了一段时间,然后有被废弃了。

C99官方文档(第297页):

7.19.7.7 The gets function
Synopsis
1 #include <stdio.h>
char *gets(char *s);
Description
2 The gets function reads characters from the input stream pointed to by stdin, into the
array pointed to by s, until end-of-file is encountered or a new-line character is read.
Any new-line character is discarded, and a null character is written immediately after the
last character read into the array.
Returns
3 The gets function returns s if successful. If end-of-file is encountered and no
characters have been read into the array, the contents of the array remain unchanged and a
null pointer is returned. If a read error occurs during the operation, the array contents are
indeterminate and a null pointer is returned.

C11官方文档(前言,第14页):

removed the gets function (<stdio.h>)

C99文档告诉我们,gets函数的返回值是字符串的首地址,然后C11文档告诉我们,gets函数已经被移除了,实际上,在C11中并没有移除gets函数,直到C14才完全移除了gets函数,笔者做了如下实验。

示例程序:

#include <bits/stdc++.h>
using namespace sts;
int main(void){
    char a[10];
    gets(a);
    return 0;
}

然后分别用C98,C11,C14,C17运行了一下,结果如下:

g++ -o test test.cpp -std=c++98抛出waring,gets is dangerous
g++ -o test test.cpp -std=c++11抛出waring,gets is dangerous
g++ -o test test.cpp -std=c++14抛出error,gets is not declared
g++ -o test test.cpp -std=c++17抛出error,gets is not declared

所以,如果我们用了C14以上版本,我们就不要使用gets函数了。

<think>我们正在处理用户的问题:在VisualStudio中使用C语言的scanf函数需要添加哪些指令或配置?根据提供的引用内容,我们可以总结出以下几种方法:方法1:使用scanf_s代替scanf(不推荐,因为不通用)方法2:在代码开头添加宏定义#define_CRT_SECURE_NO_WARNINGS方法3:在项目属性中设置预处理器定义_CRT_SECURE_NO_WARNINGS方法4:禁用特定警告(通过#pragmawarning(disable:4996))然而,用户明确询问的是“指令或配置”,所以我们重点介绍指令(在代码中添加)和配置(在项目设置中)两种方式。根据引用[4]:在代码开头添加#define_CRT_SECURE_NO_WARNINGS1,这样在每次创建新源文件时自动包含这一行。引用[3]提到错误信息,并建议使用scanf_s或使用_CRT_SECURE_NO_WARNINGS。引用[1]和[2]也提到了scanf_s的局限性(不通用)以及使用宏定义的方法。因此,我们给出两种主要方法:代码内指令和项目配置。注意:引用[4]还提供了一种修改newc++file模板的方法,使得每次新建源文件时自动添加宏定义,但这属于高级配置,用户可以选择性使用。下面我们详细说明:</think>在 Visual Studio 中使用 C 语言的 `scanf` 函数需要进行特殊配置,因为 VS 出于安全考虑默认禁用了此函数。以下是几种解决方案: ### 方法 1:添加宏定义(推荐) 在代码**第一行**添加宏定义: ```c #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int num; scanf("%d", &num); // 现在可正常使用 return 0; } ``` 此方法仅需添加一行代码,且不影响跨平台兼容性[^3][^4]。 ### 方法 2:项目属性配置 1. 右键点击项目 → 选择 **"属性"** 2. 进入 **"配置属性" → "C/C++" → "预处理器"** 3. 在 **"预处理器定义"** 中添加: ``` _CRT_SECURE_NO_WARNINGS ``` 4. 点击应用并重新编译[^3][^4] ### 方法 3:临时禁用警告(不推荐) 在包含头文件前添加: ```c #pragma warning(disable : 4996) ``` 此方法仅对当前文件有效,需在每个使用 `scanf` 的文件中添加[^3]。 ### 方法 4:修改文件模板(一劳永逸) 1. 搜索并找到 `newc++file.cpp` 模板文件(路径示例:`VS安装目录\VC\Tools\MSVC\版本号\include`) 2. 用记事本打开,在首行添加 `#define _CRT_SECURE_NO_WARNINGS 1` 3. 保存(需管理员权限) 此后新建的 `.c` 文件会自动包含此宏[^4]。 > ⚠️ **注意事项** > - 不推荐使用 `scanf_s`(VS 特有函数,降低代码可移植性)[^1] > - 上述方法同样适用于 `gets`, `strcpy` 等被禁用的 C 标准函数[^1] --- ### 相关问题 1. 为什么 Visual Studio 默认禁用 `scanf` 函数?[^1][^3] 2. 如何解决 VS 中 `gets` 或 `strcpy` 函数的安全警告?[^1] 3. `scanf_s` 与 `scanf` 在参数传递上有何区别?[^1] 4. 在 Linux GCC 环境下是否需要类似配置?[^2] 5. 除宏定义外,还有哪些方法可以禁用 VS 的特定编译警告?[^3] [^1]: VS 出于安全考虑禁用某些 C 标准函数,因它们可能导致缓冲区溢出漏洞 [^2]: `scanf_s` 是 VS 特有的安全函数,会降低代码跨平台兼容性 [^3]: 错误 C4996 的解决方案包括宏定义、项目配置或警告禁用 [^4]: 修改文件模板可永久解决新建文件的 `scanf` 报错问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值