第五章:输入输出缓冲机制 ----scanf printf

Posted 歌咏^0^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章:输入输出缓冲机制 ----scanf printf相关的知识,希望对你有一定的参考价值。

1、什么叫缓冲区
    缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数据,这部分预留的空间叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。


2、为什么要有缓冲区

  •     减少IO设备的操作
  •    提高计算机的运行速度。

比如:我们从磁盘里读取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

3、缓冲区的类型

  •    全缓冲:当填满缓冲区之后,才会进行实际IO操作。 比如 对磁盘文件的读写。 ---window 全缓冲大小4096字节   linux 全缓冲大小 1024字节
  •    行缓冲:当在输入和输出中遇到换行符时,执行真正的IO操作,也就是冲刷缓冲区的数据。比如键盘输入数据
  •   不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

下列情况会引发缓冲区的刷新:

  1.     缓冲区满时;
  2.     执行fflush语句;    fprintf(stderr, ”错误,请检查输入的参数!”) //fflush(stdout),stdout标准输出,fflush手动冲刷标准输出缓冲区的数据;
  3.     执行endl语句;
  4.     关闭文件。

    

  •   printf()  ---> 输出字符串到终端下
  •   scanf()  ---> 从键盘获取字符   --> 需要变量的地址,根据地址,存放在变量中
  •   返回值:成功返回获取到的变量的个数

-------------------------------------------------------------------------------------------------
printf函数 
    ----调试代码

研究一个函数:  1、百度    2、查看linux中文C手册       3、man手册(英文)

头文件
    #include <stdio.h>

  • 函数原型   int printf(const char * format, ...);  变参  函数
  • 函数作用     将指定格式的数据  输出   到 屏幕终端上(输出设备)
  • 函数参数      format----》指定格式---》也就是将数据 以什么样的方式 打印到屏幕上 

                                  ...----》参数不固定

  1. %s       字符串格式
  2. %d       整型  int
  3. %c       字符型  char
  4. %hd     短整型  short int
  5. %hhd   字符型的ascii码   char 数据对应的ascii码 的值
  6. %f        单精度浮点型(实型) float
  7. %lf       双精度浮点型  double
  8. %ld      long  int
  9. %lld     long long int
  10. %x     十六进制
  11. %#x   十六进制 并且 十六进制 的前缀 0x也会打印出来
  12. #o      八进制
  13. %#o   八进制 并且  八进制的前缀0打印出来
  14. %e     以科学计数法的方式打印出来
  15. %p     打印内存的地址


int  a = 100;
printf("a:%d\\n",a);

函数返回值         成功        返回参数数目
                           失败        返回-1, 错误原因存于errno中.

重点:printf()的字符串换行写是必须加上双引号,不然会出错,如

           printf("mm chch hehe shasha tiuitu shd\\n");

           换行后

           printf("mm chch hehe shasha" 

         " tiuitu shd\\n");

补充:printf("%d %f\\n", 2/3 , 2/3); // 0  0.000000  2/3整除后,再转换为浮点型

           

注意:   

       转换指定符以百分号(%)开头,确定数据在屏幕上显示的形式

        以反斜杠(\\)开头的转义序列可以在字符串中插入无法指定的特殊字符,如: \\?  \\'   \\"   \\\\

%%


scanf 

头文件       #include <stdio.h> 

函数原型    int scanf(const char * format, ...); 

函数作用    从屏幕中端上获取 指定格式数据,存储到变量的内存空间上

函数说明 scanf()会将输入的数据根据参数format字符串来转换并格式化数据. scanf()格式转换的一般形式如下
   %[*][size][l][h]type  


   以中括号括起来的参数为选择性参数, 而%与type则是必要的.  * 代表该对应的参数数据忽略不保存. 
      Size           数据长度.
      l                 输入的数据数值以 long int 或double型保存. 
      h                输入的数据数值以short int 型保存. 


     底下介绍type的几种形式
     %d                     输入的数据会被转成后int.
     %i                      转换为有符号十进制/ox"或"OX"开头,十六进制/ "o"开头,八进制数字
     %o                     转换为无符号八进制
     %u                     转换为无符号正整数
   %x/%X                 输入无符号十六进制,转换后unsigned int
 %f/%e/%E/%g        输入有符号浮点型, 转换后float
    %s                       输入数据为以空格字符为终止的字符串.
    %c                       输入单一字符.
    [ ]                          只允许括号内的字符. 如[a-z]. 
    [^]                        不允许中括号的^符号后的字符出现, 如[^0-9]. 

函数参数      format

返回值           成功        返回参数数目
                      失败        返回-1, 错误原因存于errno中.

补充scanf("asdfghj %d",&a);  输入时要把字符串照样打出来

 ---------------------------------------------------------------------------------

#include<stdio.h>

int main()

{

    //从屏幕终端上获取指定格式的数据,保存到变量的内存空间(地址)上

    

/*  int value1=0;

    int value2=0;

    

    printf("请输入数据:");

    int ret = scanf("%d %d",&value1,&value2); // ww 100

    if(ret==0)

    {

        printf("获取数据失败,请重新输入 ret:%d\\n",ret);

        //先清空输入缓冲区      

        while(1)

        {

            //每次从输入缓冲区中获取一个字符

            char cret = getchar();

            if(cret == '\\n')

                break;

            

            printf("cret:%c\\n",cret);

        }

        

        ret = scanf("%d %d",&value1,&value2);

    }

    printf("value1:%d value2:%d ret:%d\\n",value1,value2,ret); */

    char name[256];

    

    scanf("%s",name);

    

    printf("name:%s\\n",name);

    

    return 0;

}

-----------------------------------------------------------------------------------------

以上是关于第五章:输入输出缓冲机制 ----scanf printf的主要内容,如果未能解决你的问题,请参考以下文章

一站式学习Wireshark第五章

操作系统——第五章 输入输出(I/O)管理

第五章 linux重定向和管道

第五章实践报告

======第五章设备管理======

算法第五章实践报告