学习嵌入式第五天——输入输出

        什么是输入和输出?所谓输入和输出是以计算机主机为主体而言的,从计算机的内存中向外部设备输出数据成为输出,从输入设备向计算机内存输入数据成为输入。C语言本身并不提供输入和输出功能,所使用的是C语言函数库中的“标准输入输出”函数。在C语言的函数库中提供的输入输出函数有操作单个字符的getchar/putchar,操作字符串的gets/puts,和格式化的函数printf/scanf,而要在程序中使用这些函数要引用<stdio.h>头文件。

一、getchar/putchar

1.getchar

int getchar(void);  //函数原型

功能:从键盘获取一个字符;

参数:void:表示为空,使用时不需要给实参

返回值为获取的字符的ASCII码

int ret;
ret = getchar();  //表示获取到getchar读取的字符的ASCII值

2.putchar

int putchar(int c);  //函数原型

功能:输出一个字符

参数c:为要输出的字符

返回值:若成功输出字符的ASCII码值,若失败则返回-1

二、printf

printf(const char *format,...); //函数原型

其中“...”表示可变参数即个数可以改变

printf函数的格式也可表达为:printf("格式控制符串",输出参数列表);

1.格式控制字符串

(1)普通字符,原样输出即可

(2)占位符,用于匹配后面的输出参数。占位符分为整型、浮点型和字符型。

a.整型

%d表示转换为有符号十进制形式

%u表示转换为无符号十进制形式

%o表示转换为八进制形式

%x表示转换为十六进制形式

%X表示转换为十六进制形式,输出的字母均为大写

b.浮点型

%f表示转换为十进制形式的小数,输出是默认保留6位小数,不足6位时补0

%e表示转换为科学计数法形式

%E表示转换为科学计数法形式,其中指数中的e为大写E

%g表示以一种简洁的方式输出,同时不会输出无意义的0

c.字符型

%c表示转换为字符形式输出

%s表示转换为字符串形式输出

对于格式控制字符串还写为%[辅助控制符]d,

#:%#o或%#x表示打印出八进制或十六进制的前缀

n:n为数字,表示要输出数据的宽度,如果数据本身的宽度>n,此时按照实际宽度输出;如果数据本身的宽度<n,此时按照n宽度输出,空出的位置为空格且默认右对齐,-n为左对齐;0n表示多出来的位置可以填充0(只用于右对齐);.n在%f和%e中表示保留n为小数,如%.2f表示保留两位小数,在%s中表示保留前n个字符。

l:long

ll:long long

h:half

hh:half half

注意:占位符与输出参数的对应关系一一对应

三、scanf

scanf函数的格式:scanf("格式控制字符串",地址列表);

1.格式控制符串

(1)普通字符:按照键盘输入的字符原样输入

(2)占位符:与printf中的占位符类型一样,但scanf中的占位符是将从键盘输入的数据转换为指定的格式,辅助控制符的使用也有所不同,如%nd,其中n为数据宽度;对于%f在加入辅助控制符时输入要做到精准匹配,如%f对应数据类型应为float,%lf对应的数据类型为double,%Lf对应的数据类型为long double,%ld对应的数据类型为long.%lld对应的数据类型为long long.

2.地址列表

int a;
scanf("a = %d",&a);

       由于scanf并不是从键盘输入直接读取数据,而是键盘输入的数据先进入缓存区中,按下回车键后,程序才回从缓存区中读取数据,故需要在缓存区中分出空间用于数据的暂存,所以scanf需要知道这部分空间的地址才能读取缓存区中的数据,故需要取地址&。

       为正确使用scanf函数,要掌握以下几点:

(1)scanf格式控制字符串中应尽量不出现普通字符,一般只有占位符。这是由于普通字符在使用scanf输入的时候原样输入即若scanf("a = %d",&a);在输入时应需要输入“a = ”,比较麻烦,所以可以在scanf函数前有printf("a = ");然后scanf函数只包含占位符即scanf("%d".&a);

(2)scanf的地址列表中一定是有效字符,因为scanf要从改地址读取输入的数据

(3)scanf输入结束的条件(匹配结束的条件)

a.遇到非法字符时匹配结束。非法字符即为与占位符类型不同的字符。

b.遇到空白符时匹配结束。空白符包括空格、回车、tab。

c.输入字符超过指定宽度时匹配结束。如若scanf("%3d",&a);输入字符大于3时即匹配结束。

(4)scanf的格式控制字符串中如果出现空格表示匹配任意多个空白符

注意:若格式控制字符串为%c时,输入数据会匹配所有字符,为避免读取错误可在%c前加空格或加%*c,但%*c只可匹配任意的一个数据。

一下两个程序可用于练习和掌握本小结的内容:

1.若执行下列语句时,输入数据:1234 01234%67 1234<回车>,则变量a的值为__,b的值为_,s的值 为__,c的值为___。

int a;

float b,c;

char s;

scanf("%d%f%c%f\n",&a,&b,&s,&c);

#include<stdio.h>

int main(void)
{
    int a;
    float b,c;
    char s;
    scanf("%d%f%c%f\n",&a,&b,&s,&c);
    printf("a = %d b = %f c = %f s = %c\n",a,b,c,s);
}

该程序的运行结果为

在这段代码中,对于输入的数据,a匹配1234,b匹配01234,s匹配%,c匹配67,\n与空格匹配至此结束匹配。

2.

#include<stdio.h>
#include<math.h>
 
 int main(void)
 {
     float a,b,c,s,area;
 
     printf("Input three num:");
     int ret = scanf("%f%f%f",&a,&b,&c);
  
     while(ret < 3)
     {
         printf("ret = %d input again!\n",ret);
 
         while(getchar() != '\n') //清除缓冲区
            ret = scanf("%f%f%f",&a,&b,&c);
     }
 
     s = (a+b+c)/2;
     area = sqrt(s*(s-a)*(s-b)*(s-c));                                                                                               
 
     printf("area = %f\n",area);
  
     return 0;
 }

运行结果为

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值