什么是输入和输出?所谓输入和输出是以计算机主机为主体而言的,从计算机的内存中向外部设备输出数据成为输出,从输入设备向计算机内存输入数据成为输入。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;
}
运行结果为