C语言输入与输出

思考问题

1、C语言输入输出有哪几种方式?并且思考其函数调用的格式要求?
2、scanf的返回值代表什么?如何更准确的利用其返回值?scanf常见的写法错误是什么?scanf的%c如何应对空格被误输入?
3、行缓冲模式,如何规避行缓冲模式带来的异常?

输入输出基础

顺序结构的流程:
输入数据->处理数据->输出数据 特点: 自上而下,依次按顺序执行

输入输出方式
获得输入数据的方式:键盘,文件
程序输出数据的方式:屏幕,文件

C语言中输入输出所使用的标准库
标准库函数 #include \<stdio.h> scanf/printf

数据的格式化输出

什么是标准化输出?按指定格式和类型输出变量的值,或者输出一行字符串。
printf(格式化控制字符串,输出值参数表)

printf("a=%d b=%f", a,b);
%d decimal    十进制有符号int型
%u unsigned 十进制无符号int型
%f  float         小数形式6位小数 输出float、double
%e exponent 标准指数输出float double

%c character以字符形式输出  字符ascii码 所以还可以%d输出

l   加d、u前输出long型 %ld
h 加d、u前输出short型 %hd 

m   输出数据的最小域宽 大于m按照实际位宽输出 小于m 右对齐,左补空格 %10f
-m 左对齐,右补空格

显示精度 .n 对浮点数表示输出n为小数 %m.nf 【%10.4f】

思考:如何输出% ? 【%%即可】

数据的格式化输入

scanf(格式控制字符串,输入地址表); scanf(%d%f”,&a, &b);

两种情况需要注意的案例 ☆
* 1、忘记& 直接无法运行
* 2、未按照正常的声明定义格式控制字符串 脏数据

如何分割多个输入数据?
* 空格 Tab或回车
* 达到输入位宽
* 遇非法字符

scanf()的返回值 = 正确读入的数据项数

还可以预设附加字符,不影响提示
%d,%d 1,2
a=%d,b=%d a=1,b=1

scanf格式字符

%d 输入十进制int型
%f,%e 输入float型(不能指定输入数据的精度)
%c 输入一个字符(包括空白字符)

常见错误
* scanf(“%7.2f”,&a)
* scanf(“%f”,a)
* scanf(“%f\n”,&a)

scanf()的格式修饰符

m 输入数据的位宽
l  加d、u前输入long型 
   加f、e前输入double型 
L 加f、e前输入long double型 
h 加d前输入short型
* 输入项读入后不赋值 跳过输入项

%ld 输入long int型
%hd 输入short int型
%f 输入float型
%lf 输入double型

输入%f %lf 但是输出%s?
因为调用scanf输入数据时,通过地址指向变量,%f告诉编译器scanf在该地址存储一个float型数,%lf告诉编译器scanf在改地址存储一个double型数,但是调用printf输出数据时,编译器将float字段转换为double类型,printf无法区分float和double

字符的输出

字符在内存中如何存储? 对应的ASCII码的二进制值,所有ASCII码都可以通过转义方式表示 ‘B’ ‘\102’

如何定义一个字符型变量? char ch=’B’

字符型变量的值:ASCII码值,普通整数,可做算数运算

字符输出函数putchar() putchar(ch);
字符输入函数ch = getchar();

注意:putchar(‘\n’) 不能写成putchar(“\n”)

比较:
getchar putchar 速度快
scanf printf 更灵活

行缓冲输入方式
getchar会将输入字符先放入输入缓冲队列中,再从缓冲队列读取字符,直到键入回车符或文件结束符EOF时,程序才认为输入结束,一行输入结束,getchar才开始从输入缓冲队列读取字符,前面函数没读走的数据仍在缓冲队列中,将被下一个函数读取

getchar为什么以行为单位读取字符呢?
实际是按文件的方式读取字符,文件一般都是以行为单位的

注意:
有时getchar也可能返回负值,若在Unix/Linux下遇到组合键Ctrl+D 则返回EOF 一般定义为-1 【为了防止这种形式一般定义一个整形常量接受 然后赋值给char】

如何避免scanf函数以c格式字符读入字符型数据的时候读入空格回车这些空白字符呢?
1、调用scanf前getchar()读走一下
2、在%c前加上空格 忽略缓冲区中的空白字符

0条留言