在Visual Studio(VS)中编写C语言程序时,许多初学者会遇到一个令人困惑的报错:当使用gets()
函数从标准输入读取字符串时,编译器会弹出一个错误,提示“error C4996: ‘gets’: This function or variable may be unsafe.”,这并非VS的bug,而是一个重要的安全提醒,本文将深入探讨这个报错的原因,并提供安全、规范的解决方案。
问题的根源:gets()
函数的“原罪”
要理解VS为何报错,我们必须先了解gets()
函数本身存在的严重设计缺陷。gets()
函数的原型非常简单:
char *gets(char *str);
它的功能是从标准输入(通常是键盘)读取一行字符,并将其存储到str
所指向的字符数组中,这个函数有一个致命的弱点:它不进行任何边界检查。
这意味着,如果你定义了一个大小为10的字符数组,但用户输入了超过9个字符(因为还需要一个位置给字符串结束符