fgets、gets_s和fputs

C Primer Plus总结
gets和puts的替代品
fgets()函数通过第2个参数限制读入的字符数来解决溢出的问题。该函
数专门设计用于处理文件输入,所以一般情况下可能不太好用。fgets()和
gets()的区别如下。fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止。
如果fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不
同,gets()会丢弃换行符。fgets()函数的第3 个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识符定义在stdio.h中。
因为 fgets()函数把换行符放在字符串的末尾(假设输入行不溢出),通
常要与 fputs()函数(和puts()类似)配对使用,除非该函数不在字符串末尾
添加换行符。fputs()函数的第2个参数指明它要写入的文件。如果要显示在
计算机显示器上,应使用stdout(标准输出)作为该参数。程序清单11.7演
示了fgets()和fputs()函数的用法。

#include<stdio.h>
#define SIZE 14
int main() {
  char words[SIZE];
  puts("Enter a string, please.");
  fgets(words, SIZE, stdin);
  printf("Your string twice:\n");
  puts(words);
  fputs(words, stdout);
  return 0;
}

如果一切进行顺利,fgets函数返回的地址与传入的第 1 个参数相同。但是,如果函数读到文件结尾,它将返回一个特殊的指针:空指针(null pointer)。该指针保证不会指向有效的数据,所以可用于标识这种特殊情况。在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替更常见(如果在读入数据时出现某些错误,该函数也
返回NULL)。

C11新增的gets_s()函数(可选)和fgets()类似,用一个参数限制读入的
字符数。假设把程序清单11.9中的fgets()换成gets_s(),其他内容不变,那么
下面的代码将把一行输入中的前9个字符读入words数组中,假设末尾有换行
符:
gets_s(words, STLEN);
gets_s()与fgets()的区别如下。
gets_s()只从标准输入中读取数据,所以不需要第3个参数。
如果gets_s()读到换行符,会丢弃它而不是储存它。
如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首
先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换
行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或
你选择的其他函数),可能会中止或退出程序。
第2个特性说明,只要输入行未超过最大字符数,gets_s()和gets()几乎一
样,完全可以用gets_s()替换gets()。第3个特性说明,要使用这个函数还需要
进一步学习。
我们来比较一下 gets()、fgets()和 gets_s()的适用性。如果目标存储区装
得下输入行,3 个函数都没问题。但是fgets()会保留输入末尾的换行符作为
字符串的一部分,要编写额外的代码将其替换成空字符。
如果输入行太长会怎样?使用gets()不安全,它会擦写现有数据,存在
安全隐患。gets_s()函数很安全,但是,如果并不希望程序中止或退出,就
要知道如何编写特殊的“处理函数”。另外,如果打算让程序继续运行,
gets_s()会丢弃该输入行的其余字符,无论你是否需要。由此可见,当输入
太长,超过数组可容纳的字符数时,fgets()函数最容易使用,而且可以选择
不同的处理方式。所以,当输入与预期不符时,gets_s()完全没有fgets()函数方便、灵活。也许这也是gets_s()只作为C库的可选扩展的原因之一。鉴于此,fgets()通常
是处理类似情况的最佳选择。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fputs()函数和fgets()函数是C语言中用于文件输入输出的函数。 fputs()函数用于将字符串写入指定的文件中,第一个参数是要写入的字符串,第二个参数是指定要写入的文件。如果要将字符串显示在计算机显示器上,可以使用stdout作为文件参数。 fgets()函数用于从指定的文件中读取一行字符串,第一个参数是存储读取结果的字符数组,第二个参数是指定读取的最大字符数,第三个参数是指定要读取的文件。fgets()函数会在读取到换行符或达到最大字符数时停止读取。 这两个函数可以配合使用,例如可以先使用fgets()函数从文件中读取一行字符串,然后使用fputs()函数将该字符串写入另一个文件或显示在屏幕上。 引用中的代码示例展示了如何使用fgets()和fputs()函数。首先使用fgets()函数从标准输入(stdin)中读取字符串,然后使用puts()函数将该字符串显示在屏幕上,接着使用fputs()函数将该字符串写入标准输出(stdout)。然后再次使用fgets()函数从标准输入中读取字符串,并使用相同的方法显示和写入。 引用提到了fgets()函数与gets()函数的区别。fgets()函数通过第二个参数限制读入的字符数,从而避免溢出问题。而gets()函数没有这样的参数限制,因此可能存在溢出的风险。因此,在处理文件输入时,一般推荐使用fgets()函数而不是gets()函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [fgets()函数和fputs()函数](https://blog.csdn.net/m0_62621938/article/details/126572749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值