c - 获取()函数抛出异常?
问题描述
void getInputWith_gets()
{
char firstName[5];
char lastName[5];
printf("Enter your first name: ");
gets(firstName);
printf("Enter your last name: ");
gets(lastName);
printf("Hello, %s, %s\n", firstName, lastName);
}
int main(int argc, char **argv)
{
getInputWith_gets();
//getInputWith_fgets();
system("pause");
return 0;
}
我正在使用 MS Visual Studio 2017,我知道使用“gets()”函数的限制,我最多可以输入 5 个字符,但如果我输入正好 5 个字符,控制台打印正确(并且不打印“按任意键继续...由于“系统(“暂停”)状态“),但程序卡在调试器屏幕上,在最后一个“printf”语句之后,我得到一个红色错误符号,并弹出一个说:“运行时检查失败 #2 - 变量‘lastName’周围的堆栈已损坏。”这是否意味着“gets()”函数将仅读取 5 个独占字符?
解决方案
您在这里有多个错误:
- 在古老的、过时的 C 中
gets
存在的地方,您必须#include <stdio.h>
否则可能会遇到奇怪的运行时行为,因为古老的过时 C 允许没有原型的函数。 - 在现代和半现代 C 中,该函数
gets
已被删除/标记为过时,并且永远不应使用。请参阅为什么 get 函数如此危险以至于不应该使用它?以及必须/应该避免的标准库中的哪些功能?. - C 中的字符串是空终止的,这意味着您必须为空终止符留出空间。
另请注意,函数格式void getInputWith_gets()
已过时,您应该编写void getInputWith_gets(void)
.
总体而言,您似乎正在从完全过时的来源(超过 20 年过时)学习 C。
推荐阅读
- android - 如何使应用程序在主屏幕上可见(最小化时)?
- bigdata - Kusto 表可以有多个更新策略吗?
- javascript - 键入包装原生输入元素的 React 组件
- python - 用于注释多个点的循环?
- spring - Spring Boot:为什么在表单提交后£符号被转义?
- entity-framework - 是否可以组合两个不同类型的 IQueryable?
- c# - 尝试创建类型为“xxx”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。忍者
- ios - (BLE) 无法将数据写入 iOS 上的特征
- polygon - 自定义标记png文件和多边形不能同时显示?或者怎么做?
- python - 如何获得张量值