黑马程序员技术交流社区
标题:
“输入输出函数总结及对比”和 const(一)
[打印本页]
作者:
紫荆秋雪
时间:
2015-7-20 17:18
标题:
“输入输出函数总结及对比”和 const(一)
一、输入输出函数对比及总结
1、输入函数有哪些
1> scanf函数
2> gets函数
3> fgets函数
1>scanf函数特点
优点:可以格式化输入
缺点:不能接收空格
2> gets函数特点
优点:可以接收空格
缺点:会有一个警告,是不安全的,有安全隐患
不安全表现在,比如一个数组长度为50,如果我们输入的长度正好是50个,此时会把50个字符全部存到数组中,这样就没有空间存储字符结束符‘\0’
3> fgets函数
优点:是一个安全的字符串接收函数
fgets函数是一个文件操作相关的函数,暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中
小结:在之前的blog中已经对其余2中输入函数进行过介绍,今天主要介绍fgets函数
2、fgets函数的使用
fgets函数的原型是
char *fgets(char *s,int n,FILE *fp)
参数数量比较多,有3个。而fgets相比于gets有一个显著的差别就是fgets会将行末的换行符算到读入的字符串里面。所以相同且正常(输入无错误,缓冲区够大)的情况下,fgets读入的字符串会比gets在末尾‘\0’前面多一行符;行长度超出缓冲区大小时只读入前n-1个字符。
3、fgets函数的一些特性
下面我们通过例子来展现这些特性
1>当输入的字符串长度小于数组存储长度时:
程序如下:
打印输出如下:
从打印图可以看到,asd后面空了一行,这是为什么?
为了解决这个疑问,我们打印输出字符数组中存储的内容的ascii值看看
程序代码如下:
输出打印如下:
a、s、d的ascii值分别是97、115、100.那么怎么会有10和0那这是什么,查ascii值发现10代表'\n'也就是回车,0代表'\0'这下我们终于找到了为什么输出后面会有一空行,原来是把空缺的数组位置存放回车所以假设我们输入2个字符看看数组中会存储几个ascii的值为10?输出回空几行?
程序如下:
打印输出如下:
总结:
用fgets函数作为输入的时候,当输入的字符个数少于数组长度的时候,数组中除了存储输入字符还会存储一个‘\n’字符,最后存储'\0'字符。
2>当输入的字符串长度等于数组存储长度时:
程序代码如下:
打印输出如下:
小结:
当输入字符长度正好等于数组长度的时候,会发展数组中存储输入的字符和字符'\0'
3>当输入的字符串长度大于数组存储长度时:
程序如下:
打印输出如下:
小结:
当我们输入的字符串长度大于数组长度的时候,数组中只会存储数组长度-1个内容,而其它多余的输入字符将不会被输入。这就保证了安全
4.如果想取消输出换行,可以通过以下方式:
程序如下:
打印输出如下:
总结:
从上面打印的图来看是没有了输出换行的现象
5.输出函数有哪些
1>printf函数
2>puts函数
3>fputs函数
1>printf函数的特点
优点:可以格式化输出
缺点:不安全
2>puts函数
优点:输出可以自动换行
缺点:不安全
3>fputs函数
优点:可以自动截取输入的字符串,使得我们对字符串的存取是安全的
特点:既不能输出自动换行又不可以格式化输出
下面通过例子来对比一下:
下面是用scanf函数输入、printf函数输出的例子,我们输入字符串长度大于数组长度时:
程序如下:
打印输出如下:
总结:
从打印可以看出,无论我们输入的字符串的长度是否已经超出数组长度,都快打印出我们输入的字符串,这表明我们输入的字符串已经占用了别的存储空间,发生了越界行为,这是不安全的。
下面用gets函数为输入、puts函数为输出的情况,当输入字符串长度大于数组长度时:
程序如下:
打印输出如下:
总结:
从这个打印输出可以知道,同样输入字符串的长度是多长就可以输出多长,这也占用了别的存储空间,会发生越界,是有危险的;另一点证明了puts函数是可以自动换行的。
下面我们讨论一下fgets函数、和fputs函数这两个函数哪一个函数决定安全性?
程序如下:
打印输出如下:
总结:
从程序我们可以看出程序中是用的scanf函数输入、fputs函数输出,但是当我们输入的字符串长度大于我们输出的长度时依然可以输出,这可以说明真正决定安全性的是函数fgets函数,下面我们验证一下
程序如下:
打印输出如下:
总结:
从上图打印可以验证我们上面的推测,fgets函数才是真正的决定输入输出安全性的函数
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2