C11中gets()的函数被删除 |
您所在的位置:网站首页 › gets函数puts函数 › C11中gets()的函数被删除 |
C11中替代gets()的函数 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是安全的,一旦超出,就会自动调用“处理函数”,中止或退出程序。 转载于 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |