fgetc,getc,fputc,putc,putchar,getchar
转自 http://blog.csdn.net/todd911/article/details/8952565
输入输出函数家族
家族名 目的 可用于所有的流 只用于stdin和stdout
getchar 字符输入 fgetc,getc getchar
putchar 字符输出 fputc,putc putchar
gets 文本行输入 fgets gets
puts 文本行输出 fputs puts
scanf 格式化输入 fscanf scanf
printf 格式化输出 fprintf printf
注意点:
fgetc和fputc都是真正的函数,但是getc,putc,getchar和putchar都是通过#define指令定义的宏,
所以在调用getc,putc,getchar和putchar时不能使用具有副作用的参数。
fgets的用法如下:
CHAR *fgets(CHAR *string,int n,FILE *stream);
fgets()用来从参数stream所指的文件内读入字符并存到参数string所指的内存空间,直到出现换行字符、读到文件尾或是已读了n-1个字符为止,最后会加上NULL作为字符串结束。如果在未读满n-1个字符之时,读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符,再有一个字符为NULL。如果string无法存放整行,则下一次调用fgets时将从stream的下一个字符开始读取,不会出现数据丢失的情况。
fputs向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)
gets从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在str指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
gets函数不安全,没有限制输入缓冲区的大小,容易造成溢出,所以尽量不要使用gets。
关于gets危害:
本人写的程序如下:
1 #include <stdio.h>
2 int main(void)
3 {
4 char name[10];
5 gets(name);
6 puts(name);
7 }
这个程序最简单不过了,就是一个字符串输出输入的问题,但是使用linux下的gcc编译老是不能通过,提示的问题是:
“the 'gets' function is dangerous and should not be used.”
让我很纠结,为什么这个函数不让使用,它怎么就危险了?
然后我又查阅了linux C函数库之后就明白了。书上为这个函数附加了一条说明:“由于gets()无法知道字符串的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓存溢出的安全性问题。建议使用 fgets()取代。”
原来gcc为了安全考虑就直接把gets()函数的使用权给取消了。下面是net小伙用windows下的vc编译的一个小程序,来说明gets()究竟有什么危害。
程序如下:
#include <stdio.h>
int main(void)
{
char a;
char name[];
char b;
scanf("%c",&a);
printf("a:%c\n",a); //第一次输出a的值
getchar();
gets(name);
scanf("%c",&b);
printf("name:%s;\na:%c;\nb:%c;\n",name,a,b); //输出所有的值,注意a
}
由于我们把字符串改成了“this is a text”
然后a的值莫名其妙的被替换了。紧接着编译器不能正常工作了。
在不正确使用gets()函数的时候造成的危害是很大的,就像我们刚才看到的那样,a的值被字符串name溢出的值给替换了。我想这并不是你想要的结果吧!出于安全,用fgets()来代替gets()吧!
fgetc,getc,fputc,putc,putchar,getchar的更多相关文章
- fputc和putc和putchar函数的用法
功 能: 输出一字符到指定流中 putc()与fputc()等价.不同之处为:当putc函数被定义为宏时,它可能多次计算stream的值. 关于fputc(): 原型:int fputc(char c ...
- 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。
用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...
- 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...
- 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!
如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- 分享阿里云推荐码 IC1L2A,购买服务器可以直接打9折,另附阿里云服务器部署ASP.NET MVC5关键教程
阿里云推荐码为:IC1L2A 阿里云还是不错滴. 以windows server 2008 R2为例,介绍如何从全新的服务器部署MVC5 站点. 新购买的阿里云服务器是没有IIS的,要安装IIS: 控 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。
vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...
随机推荐
- Golang官方log包详解
Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...
- 监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2) 在有些公司中,由于管理的不规范,或者是便于开发人员直接修改.部署程序,往往任何开发人员,都能登录到生产 ...
- 区块链公链分片技术(sharding)方案思维导图
- bootstrap table分页limit计算pageIndex和pageSize
由于bootstrap table的js无法直接获取pageSize和pageIndex的值,只能通过limit进行计算.
- SSM - SpringBoot - SpringCloud
SSM框架 Spring + Spring MVC + MyBatis:标准MVC模式 继 SSH (Struts+Spring+Hibernate)之后,主流的 Java EE企业级 Web应用程序 ...
- Linux 之 软件安装
单纯一个操作系统是没有办法满足我们的需求的,所以需要各种安装各种软件来满足我们日常工作.生活需求.一般情况下,Linux常用的安装方式有两种,以CentOS为例: 1.从源代码安装软件 将软件源代码编 ...
- c# 方法成员
- 1.利用BeanMap进行对象与Map的相互转换
javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个b ...
- 别人家的java语言编写的自动化测试系统
https://gitee.com/testdevops/easyrest 但是我还不会用 ~~~~(>_<)~~~~ 目前的状况是:大概知道流程了,可是第一个用例就跑步起来 自己想写一些 ...
- Codeforces 750 E New Year and Old Subsequence
E. New Year and Old Subsequence 思路:线段树维护矩阵乘法. 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...