gets
gets, gets_s
在头文件 | | |
---|---|---|
char * gets(char * str); | | (直到C11) |
char * gets_s(char * str,rsize_t n); | | (自C11以来)(可选) |
1)读stdin
入指向的字符数组,str
直到找到换行符或发生文件结束。在读入数组的最后一个字符后立即写入空字符。换行符被丢弃,但不存储在缓冲区中。
2)读取字符,stdin
直到找到换行符或发生文件结束。只将大部分n-1
字符写入指向的数组中str
,并始终写入终止空字符(除非str
是空指针)。换行符(如果找到)将被丢弃,并且不计入写入缓冲区的字符数。在运行时检测到以下错误并调用当前安装的约束处理函数:
n
是零
无论如何,在调用约束处理程序之前,gets_s首先完成读取和放弃字符,stdin直到换行符,文件结束条件或读取错误。作为所有边界检查函数,gets_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含之前用户定义为整数常量时才能保证可用<stdio.h>。
参数
str | - | 要写入的字符串 |
---|
返回值
str
成功时,NULL
失败。
如果失败是由文件结束条件引起的,则另外设置eof
指示符(参见feof()
)stdin
。如果故障是由其他错误
引起的,请设置错误
指示器(参见ferror()
)stdin
。
注意
该gets()
函数不执行边界检查,因此该函数极易受缓冲区溢出攻击的影响。它不能安全使用(除非程序在限制可能出现的内容的环境中运行stdin
)。出于这个原因,该功能在C99标准的第三勘误中已被弃用,并在C11标准中完全删除。fgets()
并且gets_s()
是推荐的替代品。
切勿使用
gets()**
。**
参考
- C11标准(ISO / IEC 9899:2011):