• puts与gets被fputs与fgets代替使用
一、puts

功能

  • 输出一个字符串

特点

  • 会自动加上换行符

C:11---puts、gets、fgets、fputs_puts

二、gets

功能

  • 用于输入一个字符串

特点

  • 普通的scanf输入字符串时遇到空格就结束读取了。gets读取时遇到空白符不会结束,遇到换行符才会结束(并且不会接受换行符)
  • 输入的字符串,并且会自动在字符串的末尾加上空白符('\0')

C:11---puts、gets、fgets、fputs_gets_02

已经被逐渐抛弃

  • 因为gets输入字符串的时候,并不知道该字符串有多大的空间。如果输入的字符串长度多出了申请的空间,会导致缓冲区溢出,会导致程序出错
  • 有人程序就可以利用gets插入和运行一些破坏系统安全的代码
  • 因此逐渐被抛弃

案例

  • 下面的str只有10个字节的空间,但是我们输入了11个字符也可以接受(多于的字符串会自动加在str的内存空间后面,如果str后面本来有信息就会被覆盖),因此不安全

C:11---puts、gets、fgets、fputs_fgets_03

三、fgets

参数

  • 参数1:输入数据要存放的位置
  • 参数2:读入的字符的最大数量-1(如果设置为n,fgets只读取n-1个字符)
  • 参数3:读入的字符来自于哪里(如果是标准输入就填stdin)

特点①

  • 输入的字符串自动在末尾加上结束符('\0')。如果输入的字符串等于字符数组的长度并且参数2设置的大小也接受多于的字符,结束符会被加在字符串末尾的下一位(不属于字符串的地址处)

特点②

  • 遇到换行符和空白符会继续读取

特点③

  • 如果输入字符串长度(会包含\0)小于该字符数组的最大长度,就会加上换行符
  • 如果输入的字符串(会包含\0)大于等于字符数组的最大长度,就不会加上换行符

例如图1str输入了10个字符就不会再加换行,图2输入了5个字符,就会加上换行符

C:11---puts、gets、fgets、fputs_fputs_04C:11---puts、gets、fgets、fputs_fputs_05

备注

  • 因为考虑到输入的字符串在某些情况下会加上\n和\0,所以输入时,将参数2设置为字符数组大小+1

演示案例

  • 输入的字符串后面自动加上\n\0,所以长度为6
  • \n的ASCII为10,\0的ASCII为0。所以显示10和0

C:11---puts、gets、fgets、fputs_fputs_06

  • 只获取了9个字符,并且没有换行符,末尾自动加上了\0

C:11---puts、gets、fgets、fputs_字符串_07

四、fputs

参数

  • 参数1:要输出的字符串
  • 参数2:要输出到哪里(如果是标准输出就写stdout)

特点

  • fputs不会将输出的字符串自动换行

案例

C:11---puts、gets、fgets、fputs_字符串_08C:11---puts、gets、fgets、fputs_字符串_09

 五、gets_s

参数

  • 参数1:输入数据要存放的位置
  • 参数2:读取的字符的最大长度

特点

  • gets_s只能从标准输入中读取数据,因此不需要参数3

内容待续。。。。。。。。