在编程中发现gets和fgets一些区别总结一下;

1、 fgets比gets安全,使用gets编译时会警告

为了安全,gets少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出。后果非常怕怕

fgets会指定大小,如果超出数组大小,会自动根据定义数组的长度截断。(redhat9.0实验并不是如此,不知为何,照样能输出)

2、 用strlen检测两者的输入的字符串长度,结果不一样

gets:

fgets:

可以看到,同样是输入123

gets只有一次换行,这是因为程序的语句printf(“%s\n”,str)

fgets有两次,而第二次是其本身把回车换行符存入了字符串里

所以,gets的长度只有3和输入的字符串长度一样,fgets是4,多出来的是回车换行符。

具体的介绍:

fgets函数fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

gets()将删除新行符, fgets()则保留新行符.

要去掉fgets()最后带的“\0",只要用 s[strlen(s)-1]='\0';即可。

fgets不会像gets那样自动地去掉结尾的\n,所以程序中手动将\n位置处的值变为\0,代表输入的结束。

针对于fgets,还要再说两句,下面这种用法,是安全的判断文件读取结束或者出错的好方式,切忌不能使用while(!feof(fp)) ,还有对于fgets的第二个参数是最大能读取文件字符的个数,一般最大的长度是1024字节。

while(fgets(..., stream)){

/* ... */

}

if(ferror(stream)){

/* ... */

}

fgets和gets的区别相关推荐

  1. fgets和scanf的区别

    fgets和scanf的区别 1.测试使用scanf的一个例子: [cpp] view plaincopyprint? #include "stdio.h" #include &q ...

  2. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解

    前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets().他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输 ...

  3. gets与fgets,puts与fputs区别

    一.gets与fgets //gets函数很危险,gets没有指定输入字符的大小,限制输入缓冲区的大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出.后果严重! 对于 gets 函数,它 ...

  4. fgets()与gets()的区别

    最重要的一点,fgets()不会过滤掉换行符,因此从文件中得到字符串"123\n"时,\n没有被换成\0,字符串长度为4.而gets()则会将换行符换成空字符\0再存储,长度为3. ...

  5. c语言中 gets puts,C语言的文件输入输出 getc putc gets puts fgets puts fscanf fprintf

    系统调用I/O函数open,write,read,都是生成文件描述符,然后对文件描述符操作,比如:STDIN_FILENO,STDOUT_FILENO 标准I/O函数,则是由fopen,fgets,f ...

  6. PHP学习笔记-文件操作1

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52294237 本文出自:[顾林海的博客] 前言 PHP支持文件上传功能 ...

  7. 关于学生信息录入(文件操作)的心得体会

    批评一下c prime plus在文件这一章的描述,明显没有谭浩强版本叙述得清楚. 首先分清楚fprintf.fscanf.fgetc.fputc.fgets.fputs这些的清晰含义(少部分语句摘自 ...

  8. 《C和指针》学习备忘

    有了之前的基础,此文只是把一些以前没有注意到的和值得学习的知识做一个记录. 第一章 作者认为使用#if 0 .... #endif比用/*和*/好,因为后者不能嵌套.但是对于//并没有说明. 第二章 ...

  9. PHP全栈学习笔记7

    图形图像处理技术,gd库的强大支持,PHP的图像可以是PHP的强项,PHP图形化类库,jpgraph是一款非常好用的强大的图形处理工具. 在PHP中加载GD库 gd官方网址下载: http://www ...

最新文章

  1. 迈向未来的那五种人,自古以来就很重要的人
  2. jpa 循环引用_JPA中按身份引用
  3. scenebuilder各控件属性介绍_Flutter 全栈式——基础控件
  4. 树莓派c语言运行_树莓派完成简单的编程(四)
  5. python 碎片图像拼接_python实现图像拼接
  6. 索然无味的正则表达式
  7. 网易云解析接口PHP源码,网易云音乐直链解析API源代码^-^
  8. php中文离线手册 chm_PHP官方中文手册2017最新完整版 带用户注释 chm
  9. 无线硬盘的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. 如何关闭Win10易升更新?
  11. iOS 自定义导航栏 简单好使用
  12. 决策树之五:连续变量计算过程
  13. Linux驱动子系统之I2C(一)
  14. ArangoDB自学笔记(万字!!全!!)
  15. Direct3D 11在windows7上提示创建d3d设备失败
  16. 如何在Qt中使用数据库Sqlite保存和提取图片
  17. 解决vs2013编译时scanf报错的方法
  18. verilog计数器
  19. Hue连接Mysql一直转圈圈连接不上的问题
  20. Excel 数据分析之Power Pivot常用函数(持续更新)

热门文章

  1. 数据结构 — 浅析红黑树原理以及实现
  2. html实现选择头像,HTML5实现上传头像图片大小选择(简单实现)
  3. 苹果应用分身_苹果微信双开,现在可以了。
  4. github.io网页无法打开(连接不是私密连接)
  5. mac 触控板手势以及常用快捷键
  6. 转:你不快乐是因为年少时得不到忘不了
  7. Abp vnext Web应用程序开发教程 5 —— 授权
  8. c语言coin函数库,Coin Test | C/C++程序员之家
  9. vue之push() pop() shift() unshift() splice() sort() reverse()等等
  10. 基于51单片机ds1302时钟、ds18b20、lcd12864的恒温器