为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数。

但是这也将带来一个问题,因为fgets()的调用格式是:

fgets (buf, MAX, fp)

fgets (buf, MAX, stdin)

buf是一个char数组的名称,MAX是字符串的最大长度,fp是FILE指针。

fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。然后fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。

问题出在有时字符串的结尾处可能多出一个换行符,我们需要把它去掉。

#include #include

#define LEN 5

intmain()

{charstr[LEN];

fgets(str, LEN, stdin);//fprintf(stderr, "%s %d\n", str, strlen(str));

for(int i = 0; i < LEN; i++)

printf("%d\t", str[i]);

printf("\n");if(str[strlen(str)-1] == '\n')

str[strlen(str)-1] = '\0';for(int i = 0; i < LEN; i++)

printf("%d\t", str[i]);

printf("\n");return 0;

}

输入:

abc

输出:

97 98 99 10 0

97 98 99 0 0

说明,当输入的字符少于指定数目时,会将最后一个换行符保存在s[len-1]的位置,s[len]处恒为'\0'。

输入:

abcdefg

输出:

97 98 99 100 0

97 98 99 100 0

说明,当输入的字符大于指定数目时,保存指定字符串长度-1个字符,不保存换行符,s[len]处恒为'\0'。

也想过用如下的函数来处理:

void clearEnter(char *p)

{while(*p)

{if(*p == '\n')*p = '\0';

p++;

}

}

但该函数有个问题,在此处处理fgets()函数获得的字符串尾的换行是有效的。假如字符串中间不是从fgets()函数获得,而字符串中间有换行符,则会将字符串中第一个换行符替换为'\0',也就丢弃了字符串的其他部分。

fgets阻塞 stdin 退出_fgets()用法笔记相关推荐

  1. fgets阻塞 stdin 退出_linux fgets 阻塞

    当前位置:我的异常网» 热门搜索 » linux fgets 阻塞 linux fgets 阻塞 www.myexceptions.net  网友分享于:2013-09-23   搜索量:159次 场 ...

  2. fgets阻塞 stdin 退出_来自stdin问题的fgets[c]

    我试过你的代码,但无法重现问题.以下代码的工作方式正是您所期望的,它会提示您输入名称,等待您键入名称,然后提示您输入地址,等等. 我想知道你是否不需要在提示输入更多信息之前阅读stdin并清空它? t ...

  3. SQLServer知识:sqlcmd用法笔记

    今天给大家介绍sqlcmd用法笔记,希望对大家能有所帮助! 1.介绍 sqlcmd是一个 Microsoft Win32 命令提示实用工具,可以通过该命令工具实现SQL语句.脚本的执行,并且可以实现脚 ...

  4. easyui前端实现多选框_前端:Element UI 多选框组用法笔记

    今天给大家分享一下Element UI 多选框组用法笔记,直接上代码! "兴趣爱好:"> "form.checkList"> for= {{item ...

  5. springboot+mybatis集成自定义缓存ehcache用法笔记

    今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助! 一.ehcache介绍 EhCache 是一个纯Java的进程内缓存管理框架,属 ...

  6. SpringBoot集成Redis用法笔记

    今天给大家整理一下SpringBoot集成Redis用法笔记,希望对大家能有所帮助! 一.Redis优点介绍 1.速度快 不需要等待磁盘的IO,在内存之间进行的数据存储和查询,速度非常快.当然,缓存的 ...

  7. SpringBoot集成Mybatis用法笔记

    今天给大家整理SpringBoot集成Mybatis用法笔记.希望对大家能有所帮助! 搭建一个SpringBoot基础项目. 具体可以参考SpringBoot:搭建第一个Web程序 引入相关依赖 &l ...

  8. 前端:Element UI 多选框组用法笔记

    今天给大家分享一下Element UI 多选框组用法笔记,直接上代码! <html><head></head><body><el-form> ...

  9. shell脚本常用语句用法笔记

    脚本基本语句用法笔记 grep -i 查询时不区分大小写 -n打印匹配的行号 -v 打印不匹配的行 -AX包括每次匹配之后X行 -BX包括每次匹配之后X行 cat /etc/passwd |grep ...

最新文章

  1. 关于JS面向对象、设计模式、以及继承的问题总结
  2. oracle往mysql数据同步存储过程_Oracle数据库之间数据同步
  3. GRE词汇乱序版-夹生的词汇2
  4. 一次失败的尝试,h5+Api 结合 react,webpack,同时生成android 、ios、h5端代码
  5. ParallaxView
  6. Angular 应用里的 vendor.js 是用来干什么的?
  7. c语言和java运行效率,Java语言与C语言代码运行效率的比较.pdf
  8. 调试Micrium OS应用程序时检测任务堆栈溢出的简单方法
  9. shopex PHP Notice,shopex官网用PHP为SHOPEX增加日志功能代码
  10. 基于Nodejs+vue开发实现高校学院网站系统
  11. 成都二手房长啥样 —— 基于链家数据
  12. 长江游艇俱乐部租金问题
  13. 毕设第三周(12月19日——12月25日)
  14. 互联网晚报| 8月18日|未婚已育女性办理生育津贴不需要结婚证;拼多多将上线跨境电商平台;小米汽车将采用宁德时代麒麟和比亚迪刀片...
  15. 浅入浅出keepalived+nginx实现高可用双机热备
  16. HNUST-OJ-1806-图的遍历——广度优先搜索
  17. Geography和 Geometry 的区别
  18. C语言注释风格(函数、功能、输入、输出、返回)
  19. 【四二学堂】Go语言入门-Go语言实现的一撮金游戏
  20. XMind思维导图介绍与下载安装使用教程

热门文章

  1. vba批量导入单元格时速度过慢的解决
  2. vTESTstudio入门到精通 - vTESTstudio工具栏介绍_File
  3. 人力资源公司怎么取名
  4. 打开优酷页面服务器未显示,没法打开优酷网页,打开优酷就会出现一个窗口显示Internet Explorer没法打开Internet站点http://v.youku.c...
  5. 150倍加速机械盘,UCloud云主机IO加速技术揭秘
  6. 不务正业的爱奇艺=不限速百度云?
  7. AUMA MesseTrend 2020调查:参展商在展会质量上投入更多资金
  8. apache 多站点配置(httpd.conf简单示例)
  9. 如何在PPT中添加答案(课件)
  10. 【Python】简单的逻辑训练题目(计算机二级练习题)