[NOTE-C]C语言输入与输出

思考问题

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

输入输出基础

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

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

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

数据的格式化输出

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

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

数据的格式化输入

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

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

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

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

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

scanf格式字符

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

scanf()的格式修饰符

输入%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条留言