- puts与gets被fputs与fgets代替使用
一、puts
功能
- 输出一个字符串
特点
- 会自动加上换行符
二、gets
功能
- 用于输入一个字符串
特点
- 读取时遇到空白符不会结束,遇到换行符才会结束(并且不会接受换行符)
- 输入的字符串,并且会自动在字符串的末尾加上空白符('\0')
已经被逐渐抛弃
- 因为gets输入字符串的时候,并不知道该字符串有多大的空间。如果输入的字符串长度多出了申请的空间,会导致缓冲区溢出,会导致程序出错
- 有人程序就可以利用gets插入和运行一些破坏系统安全的代码
- 因此逐渐被抛弃
案例
- 下面的str只有10个字节的空间,但是我们输入了11个字符也可以接受(多于的字符串会自动加在str的内存空间后面,如果str后面本来有信息就会被覆盖),因此不安全
三、fgets
参数
- 参数1:输入数据要存放的位置
- 参数2:读入的字符的最大数量-1(如果设置为n,fgets只读取n-1个字符)
- 参数3:读入的字符来自于哪里(如果是标准输入就填stdin)
特点①
- 输入的字符串自动在末尾加上结束符('\0')。如果输入的字符串等于字符数组的长度并且参数2设置的大小也接受多于的字符,结束符会被加在字符串末尾的下一位(不属于字符串的地址处)
特点②
- 遇到换行符和空白符会继续读取
特点③
- 如果输入字符串长度(会包含\0)小于该字符数组的最大长度,就会加上换行符
- 如果输入的字符串(会包含\0)大于等于字符数组的最大长度,就不会加上换行符
例如图1str输入了10个字符就不会再加换行,图2输入了5个字符,就会加上换行符
备注
- 因为考虑到输入的字符串在某些情况下会加上\n和\0,所以输入时,将参数2设置为字符数组大小,可以预留一个位置存放\0
演示案例
- 输入的字符串后面自动加上\n\0,所以长度为6
- \n的ASCII为10,\0的ASCII为0。所以显示10和0
- 只获取了9个字符,并且没有换行符,末尾自动加上了\0
四、fputs
参数
- 参数1:要输出的字符串
- 参数2:要输出到哪里(如果是标准输出就写stdout)
特点
- fputs不会将输出的字符串自动换行
案例
五、gets_s
参数
- 参数1:输入数据要存放的位置
- 参数2:读取的字符的最大长度
特点
- gets_s只能从标准输入中读取数据,因此不需要参数3
内容待续。。。。。。。。