C语言的字符串输入函数gets_s()

C语言的字符串输入函数gets_s()

C语言的字符串输入函数gets_s()_第1张图片

C11新增了gets_s()函数(可选),和fgets()函数类似(上一篇博客有介绍《 C语言的字符串输入fgets()函数》),用一个参数限制读入的字符数。gets_s()函数的形式如下:

gets_s(words,STLEN);

gets_s()与fgets()的区别如下:

  • gets_s()只从标准输入(通常是键盘)中读取数据,所以不需要第3个参数。
  • 如果gets_s()读到换行符,会丢弃它而不是存储它。
  • 如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直到读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的处理函数(或者你选择的其他函数),可能会中止或退出程序。

第二个特性说明,只要输入行未超过最大字符数,gets_s()与gets()几乎一样,完全可以用gets_s()替代gets()。第3个特性,则需要我们进一步学习才能运用好。

如果目标存储区装得下输入行,gets(),fgets()和gets_s()3个函数都内问题。但是fgets()会保留输入末尾的换行符作为字符串的一部分,要编写额外的代码将其替换成空字符。

如果输入行太长,使用gets()不安全,它会擦写现有数据,存在安全隐患。gets_s()函数很安全,但是,如果不希望程序中止或退出,就要知道如何编写特殊的“处理函数”。另外,如果让程序继续运行,gets_s()会丢弃该输入行的其余字符,无论你是否需要。由此可见,当输入太长,超过数组容纳的字符时,fgets()最容易使用,而且可以选择不同的处理方式。如果要让程序继续使用输入行超出的字符串,可以参考上一篇博客–《 C语言的字符串输入fgets()函数 》的第2个例子。如果想丢弃输入行超出的字符串,可以参考上一篇博客的第一个例子。

可见,当输入与预期不符时,gets_s()函数没有fgets()函数方便、灵活。或许这也是gets_s()只作为C库的可选拓展之一。因此,fgets()通常是处理类似情况的最佳选择。


参考资料:

[1] 史蒂芬・普拉达. C Primer Plus (第6版) 中文版[M]. 人民邮电出版社, 2016.

你可能感兴趣的:(C语言,c语言,字符串,gets,输入,安全性)