输入输出原理与C语言标准输入输出函数

来源:互联网 发布:oracle数据库统计分析 编辑:程序博客网 时间:2024/05/20 10:22

输入输出原理:

输入:当键盘按下按键之后程序读取到数据

       流程

1、键盘缓冲区:键盘的内部有一块微处理器,它控制着键盘的全部工作,比如主机加电时键盘的自检、扫描,扫描码的缓冲以及与主机的通讯等等。当一个键被按下时,微处理器便根据其位置,将字符信号转换成二进制码,传给主机和显示器。如果操作人员的输入速度很快或CPU正在进行其它的工作,就先将键入的内容送往内存中的键盘缓冲区,等CPU空闲时再从缓冲区中取出暂存的指令分析并执行

2、输入缓冲区:可以看成电脑内存中的某一块

3、程序:输入缓冲区数据提交给程序

 

输出:程序内容输出屏幕

       流程

       1、程序:程序输出内容提交给输出缓冲区

       2、输出缓冲区:可以堪称内存中某一块

       3、屏幕缓冲区:类似与键盘缓冲区

 

清空输入缓冲区:

  scanf("%*[^\n]"); 丢弃所有\n之前的字符

  scanf("%*c");     丢弃任意一个字符

 

输出缓冲区内容到屏幕显示的方法:

   1、\n

   2、flush 用于刷新缓冲区

     fflush(stdout); 刷新输出缓冲区

   3、输出缓冲区满了,可以显示在屏幕上(一般大小为4Kb)

   4、程序结束

  

 

C语言的格式化输出和输入函数

1、格式化输出函数

int printf("格式字符串", 标识符名称...);

#include <stdio.h>

    printf是一个函数,""里面用于设置输出的格式,后面代表具体的输出内容

格式字符串中分以下三种字符

  (1)普通字符:一般用于打印提示信息

(2)转义字符: \n

常见的转义字符

   \n  换行

   \r  回车不换行,回到本行开始位置

   \b  退格

   \a  响铃

   \t  tab键

   

   \"  输出"

   \'  输出'

   \?  输出?

 

  (3)格式控制符:用于控制输出格式,也叫占位符

常见的格式控制符

   %d/%i   -> int

   %u      -> unsigned int

   %hd/%ld -> short/long

   

   %c      ->char

   %s      ->字符串 "nihao"

   

   %f/%lf  -> float/double

   %e      -> 指数的形式输出浮点数

   %g      -> 从%e和%f之间选择较好的输出格式输出,一般会省略后面多余的0

   

特殊:

  %x/%o   -> 十六进制格式/八进制格式

  %p      -> 输出一个地址

 

注意:

  (1)格式控制符中使用的格式 和 后面输出的数据类型要保持一致

        如果类型不一致,结果不可预知

  (2)字符类型本质就是整数,字符类型也可以使用%d格式输出

        输出ASCII

  (3)%d 和 %i的比较

        %d和%i 在printf中没有区别

                在scanf中有区别:%i除了读取十进制,还可以读取八进制 十六进制

 

特殊的格式控制符

   %      实际上就是格式控制符的开始

   

   %3d    输出的数据占用3个字符的宽度 

   %02d   输出的数据占用2个字符的宽度,如果不够空位补0  

   %-3d   输出的数据占用3个字符的宽度,左对齐,没有-默认是右对齐

     

   %m.nf  输出一个共m位宽度的数据(包含小数点),然后小数点后有n位

   

   %%     输出一个%

 

2、格式化输入

 scanf("格式字符串",标示符地址列表);

 #include <stdio.h>

       scanf是一个函数,格式字符串和printf中一样,地址列表:&num

例子:

   int num;

   scanf("%d",&num);   

   scanf在读取数据时候,会跳过前面的空白字符(空格,回车,tab键),直接去寻找指定的格式读取数据

   

2.2 注意问题

  (1)输入的数据要和scanf中指定的格式要一致

  (2)scanf的格式字符串中要求只能有格式控制符

  (3)当读取多个数据时,使用空白字符将多个输入的数据隔开

  (4)当读取多个数据中有%c格式的数据时,采用在%c前面加一个空格,表示忽略所有空白字符,直到

     遇见非空白字符

  (5)scanf中不要省略&,否则可能引发段错误

      段错误:访问了非法地址

  (6) scanf("%d",&num);

      scanf不会将末尾的回车符读走,scanf("%*c");->读取任意一个字符并且丢弃        

   

2.3 %i和%d在scanf中的区别

    在scanf中有区别:%i除了读取十进制,还可以读取八进制 十六进制

0 0