gets()函数

本文详细介绍了C语言中gets()函数的使用方法、功能、注意事项及与puts()函数的区别,强调了避免字符串溢出的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

gets() 函数   

      【1】函数:gets(字符指针)  

    【2】头文件:stdio.h(c中),c++不需包含此头文件
  【3】原型:char *gets( char *buffer );
  【4】功能:从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
  【5】注意:本函数可以无限读取,不会判断上限,所以程序员应该确保str的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。

 

gets()函数用来从标准输入设备(键盘)读取字符串直到回车结果,但回车不属于这个字符串,系统自动用'\0'代替最后的换行符。其调用格式为:
  gets(s);   其中s为字符串变量(字符串数组名或字符串指针)。
  gets(s)函数与scanf("%s:",&s)/* scanf("%s",s) */相似,但不完全相同,使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到回车为止。需要注意的是,在执行过之前的读入操作后,gets函数会将行末的回车符当作一个空行读入,因此有必要时可以写两句。
  说明:   gets(s);函数中的变量s为一字符串。如果为单个字符,编译连接不会有错误,但运行后会出现”Null pointer asignment"的错误。

      puts()与其用法基本相同,功能相反,作用为输出一个字符串。                                                                                                                                                                                ——————百度百科

 

转载于:https://www.cnblogs.com/dreamgoing/p/3560890.html

### 关于C语言`gets()`函数 #### 函数描述 `gets()`用于从标准输入流读取一行直到换行符或遇到文件结束标志EOF。该函数会将读取的内容存入给定的字符数组中,并在其后附加一个空字符`\0`表示字符串结尾[^3]。 #### 安全隐患 然而,由于`gets()`不会检查目标缓冲区的实际大小,只要用户持续键入就会一直接收字符直至遇见换行符,这可能导致严重的安全隐患——缓冲区溢出攻击。当输入长度超出预期时,额外的数据可能会覆盖相邻内存区域内的其他重要信息,从而引发不可预测的行为甚至系统崩溃。 #### 推荐替代方案 为了防止上述风险的发生,在现代编程实践中强烈建议停止使用`gets()`而改用更加安全的选择: - `fgets()`:此函数允许指定最大读取字节数作为第二个参数,有效避免了因过量输入而导致的风险。需要注意的是,不同于`gets()`,`fgets()`会在读取到换行符时将其保存下来;因此处理返回的结果前可能需要手动移除这个多余的符号[^4]。 ```c char buffer[100]; fgets(buffer,sizeof(buffer),stdin); ``` - `gets_s()`:这是C11引入的一个改进版接口,通过增加对所需空间尺寸的控制来增强安全性。不过值得注意的是并非所有编译器都支持这一特性[^1]。 ```c char words[STLEN]; gets_s(words, STLEN); ``` 对于格式化输出操作如`sprintf()`,同样存在潜在危险因为它也可能造成类似的溢出情况。为此推荐采用带宽度限定的方式调用来规避此类威胁[^2]: ```c void main(int argc, char **argv){ char usage[1024]; sprintf(usage,"USAGE: %.1000s -f flag [arg1]\n", argv[0]); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值