博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C11中替代gets()的函数
阅读量:7009 次
发布时间:2019-06-28

本文共 934 字,大约阅读时间需要 3 分钟。

1、gets()函数及其存在的问题

在读取字符串时,scanf()和%s只能读取一个单词,即遇到 ' ' (空格)就会停止读取。在程序中经常需要读取一行字符串,而不是一个单词。在C11标准前,gets()函数就可以处理这种情况,读取整行输入,直到遇到换行符,就丢弃换行符,读入剩下的字符。

例如:

#include
int main(){ char words[100]; gets(words); puts(words); return 0;}

INPUT

Hello World!

OUTPUT

Hello World!

 

但是,这里有一个严重的问题,gets()函数只有一个参数(words),gets函数只知道数组的开始地址,而不知道何时结束,因此当输入的字符串过长,就会导致缓冲区溢出问题。

2、gets()函数的替代品

1、fgets()

fgets(words,STLEN,stdin)

1、fgets()函数的第二参数指明了读入字符串的最长量,如果该参数为n,那么最多将会读入n-1个字符,或者读到换行符为止。

2、与gets()不同的是,fgets()会将读到的换行符存储在数组中,而gets()会丢弃换行符。

3、fgets()的第三个参数必须声明要读入的文件,如果从键盘读入,则声明为stdin作为参数,该标识符的定义在sdtio中。

如果我们不需要将换行符存储在数组中,那么可以将其处理掉:

int i=0;while(words[i] != '\n') i++;words[i]='\0';

2、gets_s()

gets_s(words,STLEN)

1、gets_s()函数只从标准输入中读数据,因此它不需要第三个参数。

2、gets_s()也会丢弃换行符

如果读入的字符串没有超出存储长度,那么gets_s()和gets()是非常相似的,一旦超出了存储长度,gets()函数就会不安全,因为它会修改超出部分的内存,擦写现存的数据,而gets_s是安全的,一旦超出,就会自动调用“处理函数”,中止或退出程序。

转载于:https://www.cnblogs.com/cobread/p/10846232.html

你可能感兴趣的文章