对gets()函数,可能很多人会觉得它设计时会考虑到溢出问题而进行了处理,比如假想如果我定义char string[11],那么函数在读入数据时,若超出定义长度,应自动在string[10]写'\0'结束,而不应该崩溃。如果说这种传统C风格的gets()函数有不足,那么新式的安全函数gets_s(string, n)既然给出了最大数目n,也应该会这样做——的确我曾经这样以为过。但事实上,gets_s(string, n)也一样崩溃!MSDN文档上说gets_s()会在这种溢出情况下抛出异常,但对这似乎很简单、又常用的操作,总检测异常,不是大多数人会去做的事,甚至都没有这个意识。
在理论上说,无论定义多大的缓冲区,都不确保安全(我以前在接收控制台键盘输入的时候,一般把缓冲区定到1024,设想没谁会敲那么多键盘来搞破坏,但究其实不过是赌博罢了),而且浪费,这是一个矛盾,需要平衡艺术。现代C++编程,用动态数据模型,就不需要再考虑这个问题了,但对那些坚持传统C编程的人来说,是必须要注意的问题。