概述
嵌入式学习——c语言数据的输入输出
- 一、输入输出概念
- 1.2C语言本身不提供输入输出语句
- 1.3#include头文件放在程序中
- 二、printf输出数据
- 2.2格式字符
- 三、scanf输入数据
- 3.1scanf一般格式
- 四、输入输出函数
- 4.1putchar()
- 4.2getchar()
一、输入输出概念
在c语言的程序中,几乎每一个程序都是包含输出输入语句的,如果没有输入输出语句,那么这个程序是没有意义的。
##1.1输入输出是以计算机为主体而言的
常见的输出设备:显示器,打印机等
常见的输入设备:键盘,光盘,扫描仪等。
1.2C语言本身不提供输入输出语句
输入输出的操作都是由c标准函数库中的函数来实现的,比如printf和scanf函数,printf和scanf不是c语言中的关键字,是库函数的名字。
C提供的标准函数以库的形式在C的编译系统中提供,它们不是C语言文本中的组成部分,不把输入输出作为C语句的目的是使C语言编译系统简单精炼,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输出输入语句,就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,在各种型号的计算机和编译环境下都可以适用,便于在各个计算机上实现。
1.3#include头文件放在程序中
#include<stdio.h>
如果调用标准的输入输出函数,就必须在程序开头用#include指令,把stdio头文件包含到程序中。
stdio.h是头文件,文件名的后缀是".h",在头文件放了调用标准输入输出函数的信息,包括与标准I/O库有关的变量定义和宏定义,以及对函数的声明。在对函数进行编译预处理的时候,系统就会把该在头文件中存放的内容调出来,取代本行的#inlcude指令。
值得说的是:
#include <stdio.h>
#include “stdio.h”
区别:
1.#include <stdio.h>是标准的方式。编译系统从存放c编译体统的子目录中去找所包含的头文件(stdio.h)
如果是要使用系统的库函数,因而要包含系统所提供相应的头文件,这时以标准方式为宜。
2.#.include "stdio.h"是用户自己写的头文件,编译系统会先在用户存放源程序的子目录中寻找要包含的文件,若找不到,再按标准方式查找。
如果用户想包含的头文件不是系统提供相应的头文件,而是用户自己编写的文件,这时应用“”形式,否则找不到自己的所需要的文件。
也可以写文件所在的目录
#include “C: temp file.h”
二、printf输出数据
printf函数(格式输出函数)用来向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。
##2.1一般格式
printf(格式控制,输出列表)
1.格式控制用“”括起来,且包含格式声明。如:%d,%f等
2.输出列表可以是常量,变量,或者表达式
例如:
- printf("%d",c);
- printf(“a = %d b = %dn”,a,b);//n表示光标移到下一行(换行)
2.2格式字符
2.2.1d格式,输出十进制整数。
长整型数据%ld
双长整数据%lld
printf("%dn%dn",12,-123);
输出:
12
123
域宽,在格式声明中指定输出数据的所占的列数
printf("%5dn%5dn",12,-123);
//指定输出数据占5列,输出的数据显示在此5列区域的右侧
输出:
12 //12前面有三个空格
-123 //-123前面有一个空格
2.2.2 C格式符,用来输出一个字符
例如:
char ch = 'a';
printf("%cn",ch);
输出结果
a
同样也是可以指定域宽的。
例如:
printf("%5c",ch);
运行结果:
a //前面有4个空格
一个整数在1~127范围中,也可以用%c按字符形式输出,在输出之前,系统会将该整数作为ASCII码转化成相应的字符。
例如:
short B = 97;
printf("%c",B);
输出结果:
a
如果整数比较大,则把它的最后一个字节的信息以字符形式输出
int a = 377;
printf("%c",a);
最后一个字节的信息是01111001十进制是121,对应的ASCII码是’y’
输出结果
y
2.2.3----s格式字符,用来输出一个字符串
printf("%s","WELCOME");
输出结果
WELCOME
2.2.4—f格式符
用来输出单精度,双精度,长双精度的实数,以小数形式输出。
- 基本的用%f
不用指定输出数据的长度,系统决定:
实数中整数部分全部输出,小数部分输出6位
例如:
#include <stdio.h>
int main()
{
double a = 1.0;//双精度类型
printf("%fn",a/3);//a/3也是双精度类型
return 0;
}
运行输出:
0.333333
- 指定数据宽度和小数位数用%m.nf
可以使输出的数据上下行必按小数点对齐,使输出数据整齐美观。
#include <stdio.h>
int main()
{
double a = 1.0;//双精度类型
printf("%20.15fn",a/3);//a/3也是双精度类型
//指定输出的数据占20列,小数占15列
return 0;
}
运行结果
0.333333333333333
//0的前面有3个空格
注意:
float型数据只能保证6位有效数字,
double型只能保证15位有效数字。
即使指定小数位数为50位,也不能保证输出的50位都是有效的数字。
- 输出数据向左对齐%-m.nf
当数据长度不超过m时,数据向左靠,右端补空格。
例如:
#include <stdio.h>
int main()
{
float a;
a = 10000/3.0;
printf("%-25.15fn",a);
printf("%25.15fn",a);
return 0;
}
运行结果:
第一次输出:
a向左端靠齐,右端空5列
第二次输出:
a向右端靠,左端空5列
2.2.5—e格式符
%e指定用指数形式输出实数。
编译器默认小数为6位,指数部分为5位(e占1列,符号1列,指数3列)
数值按标准化指数形式输出,小数点前必须有而且只有1位非零数字。
例如:
1.234560 e+002
6列 5列
也可以用%m.ne或者%m.nE形式的格式声明。
printf("%13.2e",123.456);
printf("%13.2E",123.456);
输出为:
1.23e+002//数的前面有4个空格
1.23E+002//数的前面有4个空格
2.2.6其他格式
用的不多,必要时可以查阅。
- i与d相同
- o八进制输出
例如:
int a = -1;
printf("%dt%on",a,a);
运行结果:
-1 37777777777
-1以补码形式存放在4个字节中,2^3=8,所以每3位构成一组
3.x或X十六进制输出
常见是#x或者#X表示输出0X~~
int a = -1;
printf("%dn",a);
printf("%on",a);
printf("%xn",a);
printf("%#Xn",a);
运行结果:
4.u格式—无符号型的数据,以十进制整数形式输出。
5.g格式—用来输出浮点数。
printf函数中用到的格式字符
格式字符 | 说明 |
---|---|
d,i | 输出有符号的十进制整数(整数不输出符号) |
u | 输出无符号的十进制整数 |
o | 输出无符号的八进制整数(不输出前o) |
x,X | 输出无符号的十六进制的整数,(不输出前导符0x),用x输出小写的a~f,用X时,以大写字母输出 |
c | 输出单个字符 |
s | 输出字符串 |
f | 输出实数可以用小数形式或者指数形式输出,以及隐含的6位小数 |
e,E | 以指数形式输出,用e时输出(如:1.2e+02)用E时(如:1.2E+02) |
g,G | 选用%f或%e格式输出宽度较短的一种格式,不输出无意义的0。用G时,若以指数形式输出,则指数以大写形式表示。 |
printf函数常用的格式附加字符
字符 | 说明 |
---|---|
l | 长整型整数,可加在格式符d,o,x,u前面 |
m(正整数) | 数据最小宽度 |
n(正整数) | 对实数表示输出n位小数;对字符串,表示截取的字符个数 |
- | 输出的数字或者字符在域内向左靠 |
三、scanf输入数据
3.1scanf一般格式
格式:
scanf(格式控制,地址列表)
格式控制:与printf的含义相同,
地址列表:可以是变量的地址,也可以是字符串的首地址。是**变量地址**
例如:
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
###3.2格式声明
scanf常用的格式字符
格式字符 | 说明 |
---|---|
d,i | 输入有符号的十进制整数 |
u | 输入无符号的十进制整数 |
o | 输入无符号的八进制整数 |
x,X | 输入无符号的十六进制的整数 |
c | 输入单个字符 |
s | 输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束,‘ ’作为字符串的结束标志。 |
f | 输入实数可以用小数形式或者指数形式输入 |
e,E,g,G | 与f作用相同 |
l | 输入长整型数据(%ld,%lo,%lx,%lu)以及double数据(%lf或者%le) |
h | 输入短整型数据(%hd,%ho,%hx) |
域宽 | 指定输入数据所占的宽度,域宽为正整数 |
* | 本输入项在读入后不赋给相应的变量 |
###3.3注意的问题
使用scanf函数应该注意的地方
(1)输入的时候是变量的地址,不是变量名。
scanf(“%f”,a);//错误,a是一个变量名
scanf("%f",&a);//正确
(2)输入的内容应该与格式控制的格式是保持一致的。
例如:
scanf(“a=%f,b=%f,c=%f”,&a,&b,&c);
那么输入的内容为
a=1,b=2,c=3//在按回车
如果输入时不是逗号而是空格或者其他字符就是错误的
如果输出
1 2 3//就是错误的
因为系统会把它和scanf函数中的格式字符串逐个字符对照检查,
只是在%f的位置上代以一个浮点数
(3)在使用%c输入字符的时,空格字符和转义字符都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3);
此时应该输入三个连续的字符,中间不能有空格!
abc
'a'送给c1
'b'送给c2
'c'送给c3
如果在中间输入空格就错了
a b c
系统会把第一个字符‘a’送给c1,第二个字符是空格字符‘ ’,送给c2,第三个字符‘b’送给c3.
(4)在输入数值数据时,如果遇到回车,空格,Tab建或者非法字符,认为该数据结束。
例如:
scanf("%d%c%f",&a,&b,&c);
输入
1234a123o.26
%d对应十进制数1234所以1234表示a
%c表示输入一个字符a是一个字符,所以a送给了b
由于%c只要求输入一个字符,系统判定已经结束输入。
123送给c,后面几个字符没有读入。
四、输入输出函数
除了printf和scanf函数可以作为字符的输出和输入以外,putchar和getchar也是可以进行字符的输入输出的。
4.1putchar()
一般格式(如下)
作用:输出字符变量c的值,c可以是字符常量,整型常量,字符变量或整型变量(其值在字符的ASCII码代码范围内)输出的是一个字符
purchar(c);
例如1:
#include <stdio.h>
int main()
{
char a = 'B',b = 'O',c = 'Y';/定义3个字符变量并初始化
putchar(a); //向显示输出字符B
putchar(b);//向显示器输出字符O
putchar(c);//向显示器输出字符Y
putchar('n');//向显示器输出一个换行符,是输出的当前位置移到下一行的开头
return 0;
}
运行结果:
字符类型也属于整数类型,因此将一个字符赋给字符变量和将数字符的ASCII码赋给字符变量的作用是一样的(整型数据范围在0~127).putchar是输出字符,会把数字转化成对应的字符。
#include <stdio.h>
int main()
{
char a = 66,b = 79,c = 89;/定义3个字符变量并初始化
putchar(a); //向显示输出字符B
putchar(b);//向显示器输出字符O
putchar(c);//向显示器输出字符Y
putchar('n');//向显示器输出一个换行符,是输出的当前位置移到下一行的开头
return 0;
}
运行结果是
BOY
putchar也可以输出转义字符
putchar('101');//输出字符A
putchar('");//输出单撇号'
putchar('