黑马程序员技术交流社区

标题: “输入输出函数总结及对比”和 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