C11中替代gets()的函数

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

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

例如:

#include<cstdio>

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是安全的,一旦超出,就会自动调用“处理函数”,中止或退出程序。

posted @ 2018-08-10 16:27  考焦的面包  阅读(649)  评论(0编辑  收藏  举报