1、gets()函数及其存在的问题
在读取字符串时,scanf()和%s只能读取一个单词,即遇到 ' ' (空格)就会停止读取。在程序中经常需要读取一行字符串,而不是一个单词。在C11标准前,gets()函数就可以处理这种情况,读取整行输入,直到遇到换行符,就丢弃换行符,读入剩下的字符。
例如:
#includeint 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是安全的,一旦超出,就会自动调用“处理函数”,中止或退出程序。