第四章:输入与输出
综述
数据的输入与输出是任何一个算法必须具有的部分
同样,对于任何一种语言来说,都必须具有输入和输出的功能.
C语言本身并不提供输入和输出的语句,具体的实现是靠调用库函数的输入/输出模块中的输入输出函数.
因此本章将介绍C语言中数据输入和输出的函数及部分数据的输入与输出
本章内容如下:
- 输入与输出函数
- 整形数据的输入与输出
- 浮点型数据的输入与输出
输入与输出函数
C语言的标准函数库中有一些输入/输出函数,可以直接在程序中调用,其中包括:
- scanf函数
- printf函数
- getchar函数
- putchar函数
- gets函数
- puts函数
需要注意的是,这些函数并不是C语言文本的组成部分,而是以函数库的形式存放在系统之中(关于什么是库函数将放在后面函数的章节讲解)
因此我们想要使用标准I/O库之前,需要用编译命令#include将有关的头文件包括到源文件中,以便程序在编译时的链接
不过在有的C语言的编译器中,考虑到scanf函数和printf函数使用非常频繁,所以直接将他们放在编译系统里了,可以不需要先添加源文件直接调用.
格式输出函数_printf()
printf()函数是格式控制输出函数
调用格式如下:
printf("格式控制符",输出项列表);
printf()函数的作用是按照自右向左的顺序,依次
- 计算"输出地址列表"中表达式的值
- 按照"格式控制字符"中规定的格式输出到显示器上
并且格式控制字符可以与转义字符和表达式一起放在双引号里面
例如:
printf("a=%d,b=%f,c=%c\n",a,b,c);
其中%d,%f,%c都是格式控制字符,a,b,c是输出序列项
下面将详细介绍格式控制字符和输出地址列表
printf()_格式控制字符
格式控制字符由%和格式字符组成
其功能是指定输出数据的格式和类型,即转换输出数据的格式,进而达到控制输出格式的作用
并且与后面的数据输出项对应,常用的格式字符见下表
格式字符 | 说明 |
---|---|
d | 输出十进制整数 |
x或X | 输出十六进制整数 |
o或O | 输出八进制整数 |
U | 输出不带符号的十进制整数 |
c | 输出单个字符,即输出的数字 会被转换为ASCII表中对应的字符 |
s | 输出字符串 |
f | 输出十进制单,双精度浮点数 |
e或E | 输出指数形式的浮点数 |
g或G | 输出指数形式的浮点数,但是不带无效0 |
% | 输出一个百分号 |
printf()_输出项列表
关于printf()输出项列表需要说明的点如下:
- 输出列表项在不需要输出变量的时候可以省略
- 输出列表项可以是多个输出项,但是各个输出项之间要用逗号隔开
- printf中的"格式说明符"和"输出项列表"在个数上必须一一对应
- 输出项列表可以有变量,常量,或表达式组成
格式输入函数_scanf()
scanf()函数是格式控制输入函数
scanf()函数调用语法如下:
scanf("格式控制字符",输入项列表);
同样,scanf函数的功能也是按照"格式控制字符"中规定的输入格式,将从键盘上读取的若干输入按照从左到右的顺序依次存入输入项列表的变量中
关于scanf函数需要说明的点如下
-
scanf函数中一个格式说明要求输入一个数据,就必须在地址列表中有一个地址与之对应,并且类型要相同
int c; scanf("%f",&c); >>>报错,因为输入的c的值的储存格式和声明c时候所确定的储存格式不同,因此编译无法通过.
-
需要注意,scanf函数本质上是"扫描"键盘输入,并且将输入存储到某一内存地址,因此必须是要对地址,而非是变量.&是取地址符号
scanf("%d",c); >>>报错,c是变量名,而非变量的地址,因此输入的数据无法储存到变量c所对应的内存地址,只能储存到储存c这个变量名的地址,因此会冲突进而报错
-
在格式说明字符中间插入得有普通字符或者转义字符时候,输入必须要按原样输入
scanf("%d,%d",&a,&b); 输入必须是: <<< 2,3 否则会报错
-
多个输入之间用空格或者[Tab]隔开,此外也可以指定按对应的列输入,但是常用
-
输入的数据多于所需要的个数时,多余的输入会被下一个scanf函数使用
scanf("%d %d",a,b); scanf("%d %d",c,d); <<<12 23 34 45 >>>a=12,b=23,c=34,d=45
-
scanf在
遇到"数据分隔符号":Tab,空格,回车
以及指定的宽度输入结束之后
认为当前数据输入结束,开始输入下一个数据 -
使用%c时候,空格回车等都会作为ASCII码值被接受
字符输入与字符输出函数
当我们想要输入或者输出一个字符的ASCII码值时候,如果我们使用printf和scanf时候,就需要使用格式控制符%c
为此,c语言中有专门的接受和输出ASCII码的输入输出函数,即getchar和putchar
getchar()函数
getchar函数是用于接受输入的字符的ASCII码值的函数
变量=getchar()
getchar函数和scanf函数不一样,没有一个函数内赋值的功能,因此通常getchar是通过上面的赋值语句的方式来储存输入的字符的ASCII码值
需要注意的点如下:
- 使用getchar函数必须要包含标准输入输出头文件
- getchar函数只能接收单个字符
putchar()函数
putchar函数是用于接受一个字符,在屏幕上输出的函数
putchar('b');
需要说明的点如下:
-
putchar中可以放入字符,也可以放入整数,还可以进行整数间的运算
int c=90; putchar(c); >>>合法 char c='A'; putchar(c+20); >>>合法
整形数据的输出
由于ASCII码的特殊性,因此对于字符型数据的输入和输出需要具有专门的输入输出函数
但是整型和浮点型并不存在类似于ASCII表这样的特殊性,因此不需要有专门的函数来输出整数和浮点数
前面其实已经介绍过了整型数据和后面要介绍的浮点型数据的输出,就是用printf及对应的格式控制符来进行输入和输出.
但是在具体的运用上有所不同,因此这里还需要特别说明.
d格式符
用法有如下几种:%d,%ld,%md,%lmd
- %d,按整数的实际长度输出
- %ld:表示按长整形输出,可以输出long型数据
- %md:m是一个数字,表示输出的数据宽度,如果m大于数据长度,那么在前面补空格,m前加负号表示在后面加空格
- %lmd:%ld和%md的结合
o格式符
用法有如下几种:%o,%lo,%mo,%lmo
和d一模一样
浮点型数据的输出
和整形数据一样,浮点型数据的输入输出也是用scanf和printf函数
这里将介绍浮点型数据输出的格式控制符
f格式符
用法:%f,%mf,%.nf,%m.nf
- m是输出的数据的指定长度
- n是表示输出时保留的具体位数
e/E格式符
用法:%e,%me,%.ne,%m.ne
与f格式符相同
额外声明
如果输入长整形的话格式控制符要用%lf.