嵌入式学习——c语言数据的输入输出

嵌入式学习——c语言数据的输入输出,第1张

嵌入式学习——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
如果调用标准的输入输出函数,就必须在程序开头用#include指令,把stdio头文件包含到程序中。


stdio.h是头文件,文件名的后缀是".h",在头文件放了调用标准输入输出函数的信息,包括与标准I/O库有关的变量定义和宏定义,以及对函数的声明。


在对函数进行编译预处理的时候,系统就会把该在头文件中存放的内容调出来,取代本行的#inlcude指令。



值得说的是:

#include
#include “stdio.h”

区别:
1.#include 是标准的方式。


编译系统从存放c编译体统的子目录中去找所包含的头文件(stdio.h)
如果是要使用系统的库函数,因而要包含系统所提供相应的头文件,这时以标准方式为宜。



2.#.include "stdio.h"是用户自己写的头文件,编译系统会先在用户存放源程序的子目录中寻找要包含的文件,若找不到,再按标准方式查找。



如果用户想包含的头文件不是系统提供相应的头文件,而是用户自己编写的文件,这时应用“”形式,否则找不到自己的所需要的文件。



也可以写文件所在的目录
#include “C: \ temp \ file.h”


二、printf输出数据

printf函数(格式输出函数)用来向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。



##2.1一般格式

printf(格式控制,输出列表)
1.格式控制用“”括起来,且包含格式声明。


如:%d,%f等
2.输出列表可以是常量,变量,或者表达式

例如:

  1. printf("%d",c);
  2. printf(“a = %d b = %d\n”,a,b);//\n表示光标移到下一行(换行)
2.2格式字符

2.2.1d格式,输出十进制整数。



长整型数据%ld
双长整数据%lld

printf("%d\n%d\n",12,-123);

输出:

12
123

域宽,在格式声明中指定输出数据的所占的列数

printf("%5d\n%5d\n",12,-123);
//指定输出数据占5列,输出的数据显示在此5列区域的右侧

输出:

   12     //12前面有三个空格
 -123     //-123前面有一个空格

2.2.2 C格式符,用来输出一个字符
例如:

char ch = 'a';
printf("%c\n",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格式符
用来输出单精度,双精度,长双精度的实数,以小数形式输出。


  1. 基本的用%f
    不用指定输出数据的长度,系统决定:
    实数中整数部分全部输出,小数部分输出6位
    例如:
#include 
int main()
{
	double a = 1.0;//双精度类型
	printf("%f\n",a/3);//a/3也是双精度类型
	return 0;
}

运行输出:

0.333333
  1. 指定数据宽度和小数位数用%m.nf
    可以使输出的数据上下行必按小数点对齐,使输出数据整齐美观。


#include 
int main()
{
	double a = 1.0;//双精度类型
	printf("%20.15f\n",a/3);//a/3也是双精度类型
	//指定输出的数据占20列,小数占15列
	return 0;
}

运行结果

   0.333333333333333 
   //0的前面有3个空格

注意:
float型数据只能保证6位有效数字,
double型只能保证15位有效数字。



即使指定小数位数为50位,也不能保证输出的50位都是有效的数字。


  1. 输出数据向左对齐%-m.nf
    当数据长度不超过m时,数据向左靠,右端补空格。



    例如:

#include 
int main()
{
	float a;
	a = 10000/3.0;
	printf("%-25.15f\n",a);
	printf("%25.15f\n",a);
	return 0;
}

运行结果:
第一次输出:
a向左端靠齐,右端空5列
第二次输出:
a向右端靠,左端空5列

2.2.5—e格式符
%e指定用指数形式输出实数。



编译器默认小数为6位,指数部分为5位(e占1列,符号1列,指数3列)
数值按标准化指数形式输出,小数点前必须有而且只有1位非零数字。



例如:

1.234560 e+002
	65

也可以用%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其他格式
用的不多,必要时可以查阅。


  1. i与d相同
  2. o八进制输出
    例如:
int a = -1;
printf("%d\t%o\n",a,a);

运行结果:

-1      37777777777

-1以补码形式存放在4个字节中,2^3=8,所以每3位构成一组



3.x或X十六进制输出
常见是#x或者#X表示输出0X~~

int a = -1;
printf("%d\n",a);
printf("%o\n",a);
printf("%x\n",a);
printf("%#X\n",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输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束,‘\0’作为字符串的结束标志。


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 
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 
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('1');//输出字符A
putchar('\");//输出单撇号\'
putchar('5');//八进制的15=十进制13,对应的ASCII是“回车”,不换行
4.2getchar()

getchar函数是只能输入一个字符。


如果想输出多个字符则需要用多个getchar获取。



getchar()输入-1或者按ctr+d会结束。



例如:从键盘输入BOY的3个字符,然后输出到屏幕上。



思路:用3个getchar获取字符,然后在用putchar输出。


#include 
int main()
{
	char a,b ,c;	//定义3个字符变量 
	a = getchar();	//从键盘输入一个字符送给字符变量a 
	b = getchar();
	c = getchar();
	
	putchar(a);	//将变量a的值输出 
	putchar(b);
	putchar(c);
	putchar('\n');//换行 
	return 0;
}

注意:这是在连续输入BOY后按Enter健,字符才送到计算机中,然后输出BOY字符。



输出结果:

如果:输入B后按空格在输入O,在按空格,再输入Y,结果会是怎么样的呢?

我们可以发现输出的结果只输出了两个字符。



输入的B赋给了变量a,空格也是一个字符,于是空格赋给了变量b,接着把空格赋给了变量c,而Y就没有送给任何一个变量,此时putchar输出的只有B O ,然后执行换行,没有Y。



这里说明一下:
在用键盘输入信息的时候,并不是键盘敲一个字符,就立刻送到计算机中去,而是这些字符暂缓存放在缓冲区中只有按了Enter才能把这些字符一起送到计算机中,然后按先后顺序分别赋给相应的变量

注意:
使用putchar不仅可以获取显示的字符,也可以获取屏幕上无法显示的字符,如控制字符
改一下以上的程序:把getchar作为表达式的一部分

#include 
int main()
{	
	putchar(getchar());	//将接受到的字符输出 
	putchar(getchar());
	putchar(getchar());
	putchar('\n');//换行 
	return 0;
}

运行结果:

BOY
BOY

也可以在printf中输出杠接收的字符

printf("%c",getchar());//%c是输出字符的格式声明
#include 
int main()
{	
	printf("%c",getchar());//%c是输出字符的格式声明
	printf("%c",getchar());
	printf("%c",getchar());
	putchar('\n');//换行 
	return 0;
}

例如2:从键盘输入大写字母,小写输出。



思路:小写和大写的ASCII码相差32。


#include 
int main()
{	
	char c1,c2;
	c1=getchar();//获取大写字母,赋给变量c1 
	c2=c1+32; //小写和大写ASCII码相差32 
	putchar(c2);//输出大写 
	putchar('\n');//换行 
	return 0;
}

运行结果

也可以用printf输出

#include 
int main()
{	
	char c1,c2;
	c1=getchar();//获取大写字母,赋给变量c1 
	c2=c1+32; //小写和大写ASCII码相差32 
	printf("大写字符:%c\n",c1); 
	printf("小写字符:%c\n",c2); 
	return 0;
}

运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/563993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存