第五章:输入输出缓冲机制 ----scanf printf
Posted 歌咏^0^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章:输入输出缓冲机制 ----scanf printf相关的知识,希望对你有一定的参考价值。
1、什么叫缓冲区
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数据,这部分预留的空间叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2、为什么要有缓冲区
- 减少IO设备的操作
- 提高计算机的运行速度。
比如:我们从磁盘里读取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
3、缓冲区的类型
- 全缓冲:当填满缓冲区之后,才会进行实际IO操作。 比如 对磁盘文件的读写。 ---window 全缓冲大小4096字节 linux 全缓冲大小 1024字节
- 行缓冲:当在输入和输出中遇到换行符时,执行真正的IO操作,也就是冲刷缓冲区的数据。比如键盘输入数据
- 不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
下列情况会引发缓冲区的刷新:
- 缓冲区满时;
- 执行fflush语句; fprintf(stderr, ”错误,请检查输入的参数!”) //fflush(stdout),stdout标准输出,fflush手动冲刷标准输出缓冲区的数据;
- 执行endl语句;
- 关闭文件。
- printf() ---> 输出字符串到终端下
- scanf() ---> 从键盘获取字符 --> 需要变量的地址,根据地址,存放在变量中
- 返回值:成功返回获取到的变量的个数
-------------------------------------------------------------------------------------------------
printf函数
----调试代码
研究一个函数: 1、百度 2、查看linux中文C手册 3、man手册(英文)
头文件
#include <stdio.h>
- 函数原型 int printf(const char * format, ...); 变参 函数
- 函数作用 将指定格式的数据 输出 到 屏幕终端上(输出设备)
- 函数参数 format----》指定格式---》也就是将数据 以什么样的方式 打印到屏幕上
...----》参数不固定
- %s 字符串格式
- %d 整型 int
- %c 字符型 char
- %hd 短整型 short int
- %hhd 字符型的ascii码 char 数据对应的ascii码 的值
- %f 单精度浮点型(实型) float
- %lf 双精度浮点型 double
- %ld long int
- %lld long long int
- %x 十六进制
- %#x 十六进制 并且 十六进制 的前缀 0x也会打印出来
- #o 八进制
- %#o 八进制 并且 八进制的前缀0打印出来
- %e 以科学计数法的方式打印出来
- %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的主要内容,如果未能解决你的问题,请参考以下文章