一、输入输出的概念
输入---->计算机 ---->输出 [用内存来存储输入的数据]
1.c语言并不提供输入输出功能,但存在输入输出函数库,我们可以通过调用这些函数来实现输入输出功能
2.标准的输入输出库
#include <stdio.h> //standard input output (标准输入输出)
3.三组函数
a.单个字符输入输出
getchar
putchar
b.格式化的输入输出(可以控制输入输出格式)
printf
scanf
c.字符串的输入输出 (*)
gets
puts
二、单个字符输入输出 (getchar、putchar)
getchar()
格式:int getchar(void);
功能: 获取一个字符
参数: void -- 空类型 //表示没有参数 ,靠键盘赋字符值
返回值:int 型
成功 返回读到的字符的 ASCII码值
失败 返回EOF (-1)
注意返回值:
1、getchar返回值是int类型,效果接收一个字符
2、返回值是返回值,输出效果是输入效果
返回值:牵扯到的是接收函数的返回值时要用返回值的类型来接收
输入效果:键盘上敲出一个字符,getchar获得一个字符
3、函数调用时返回值可以接收,也可以不接收,接不接收返回值不影响函数效果
3eg: int ret = getchar();
getchar();
练习:
hello
从键盘输入 hello
putchar()
格式:int putchar(int c);
功能:输出一个字符
参数:要输出的 字符的 ascii码值(或char型数据,牢记char型和int型的微妙关系)
返回值:int 型
成功 是输出的 字符的ASCII的值(整型值)
失败 EOF
//键盘上输入hello,屏幕上显示HELLO
法一:
int ch1,ch2,ch3,ch4,ch5;
ch1 = getchar();//可见返回值的类型决定了接收他时所要准备的空间类型
ch2 = getchar();
ch3 = getchar();
ch4 = getchar();
ch5 = getchar();
putchar(ch1-32);//可见效果是效果,返回值是返回值
putchar(ch2-32);//因为这里返回值是效果的话,这里应该打印出正数,而不是字符
putchar(ch3-32);
putchar(ch4-32);
putchar(ch5-32);
putchar('\n');
//法二:
putchar(getchar()-32);
putchar(getchar()-32);
putchar(getchar()-32);
putchar(getchar()-32);
putchar(getchar()-32);
putchar('\n');
三、格式化的输入输出(scanf、printf)
printf:
定义:格式化输出函数
格式:printf("格式化控制字符串",输出列表); //eg:printf("b= %d\n",10);
格式控制字符串包括:普通字符、占位符、辅助控制符
普通字符:
原样输出
占位符:
1、占了一个位置,最终输出效果,将输出列表中对应的参数,以占位符指定的格式输出
2、占位符要与输出列表相匹配,从左到右逐个对应
3、如果占位符个数大于输出列表参数个数,多的输出是随机值
占位符:
//整型
%d 以 有符号 十进制 格式 输出
%u 以 无符号 十进制 格式 输出
%x 以 十六进制 格式 输出
%X 以 十六进制 格式 输出 ,但是对应的a b c d e f 都是大写
%o 以 八进制 格式 输出
//浮点数
%f 以小数的形式输出,默认保留6位小数
-----------------%x-----------------------
int a = 123;
printf("%x", a); // 7b(十六进制)
-----------------%X-----------------------
int a = 123;
printf("%X", a); // 7B
-----------------%o-----------------------
int a = 123;
printf("%o", a); // 173(八进制)
------------------%f-------------------------
%f:不指定字段宽度,由系统自动指定,使整数部分全部输出,并输出6位小数
应当注意:在输出的数字中并非全部数字都是有效数字。显然只有前7位数字是有效数字。千万不要以为凡是计算
机输出的数字都是准确的。双精度数也可用%f格式输出,它的有效位数一般为16位,给出小数6位。
eg:
float b = 123.45678;
printf("%f", b); // 打印结果 123.456779
%g 以 更简洁 的方式输出 ,同时不会输出多余的0
%e 以 科学计数法形式 输出
%E 输出结果中 e 大写
------------------%e----------------------
float b = 1.2345678;
printf("%e", b);//1.234568e+00
float b = 123.45678;
printf("%e", b);//1.234568e+02
------------------%E-----------------------
float b = 123.45678;
printf("%E", b);//1.234568E+02
//字符
%c 以 字符的 格式 输出 //将对应的ASCII码值的字符形式输出
%s 以 字符串 格式 输出
辅助控制符:
使用格式:%[辅助控制符]d
辅助控制符的种类:
#
%#x //表示 输出十六进制 的前缀
%#o //表示 输出八进制 的前缀
int a = 123;
printf("%#x", a); //0x7b
int a = 123;
printf("%#X", a); //0X7B
int a = 123;
printf("%#o", a); //0173(0是八进制的标志)
m
m代表数字 --- 意思是控制输出的宽度
实际的参数的宽度 > m 则以实际参数的宽度为准
< m 默认右对齐 ,前面的空位补空格,m前加0可使空位显示0
左对齐 m前加一个负号
int a = 123:
printf("%5d", a); // 123(右对齐,前边有两个空格)
int a = 123;
printf("%-5d", a); //123 (左对齐,后边有两个空格)
int a = 123;
printf("%05d", a); //00123(右对齐,前边有两个空格处补零)
.n n代表数字 --- 浮点型的话意思是控制输出的小数位数 (四舍五入)
--- 字符串的话意思是输出字符串前n位
float f = 3.1467;
printf("%.2f",f); //3.15
printf("%.2s", "abcde"); //ab
l // long 类型
ll //long long 类型
h //half --一半 2个字节
hh //1个字节
printf("%ld",a);
printf("lld",b);
int a = 0x11223344;
printf("%hx\n", a); //3344
printf("%hhx", a); //44
int a = 0x11223344;
printf("%#hx\n", a); //0x3344
printf("%#hhx", a); //0x44
练习:
设a,b为int型变量,
x,y为float型变量,
c1,c2为char型变量,
且设a=5,b=10,x=3.5,y=10.8,c1=’A’,c2=’B’。
为了得到以下的输出格式和结果,请写出对应的printf语句。
(1)a = 5, b = 10, x + y = 14.3
(2)x - y = -7.3, a - b = -5
(3)c1 = ’A’ or 65(ASCII) c2 = ’B’ or 66(ASCII)
int a = 5;
int b = 10;
char c1 = 'A';
char c2 = 'B';
float x = 3.5;
float y = 10.8;
printf("a = %d,b = %d,x+y = %.1f\n",a,b,x+y);
printf("x-y = %.1f,a-b = %d\n",x-y,a-b);
法一:
printf("c1 = %c%c%cor%d(ASCII) c2=%c%c%cor%d(ASCII)\n",'\'',c1,'\'',c1,'\'',c2,'\'',c2);
法二:
printf("c1 = \'%c\'or%d(ASCII) c2 = \'%c\'or%d(ASCII)\n",c1,c1,c2,c2);
scanf
定义:格式化输入函数
格式:scanf("格式控制字符串",地址列表)
返回值(int型):
(1)返回正整数。表示正确输入参数的个数。
(2)返回整数0。表示用户的输入不匹配,无法正确输入任何值。
(3)返回-1。表示输入流已经结束。
格式控制字符串:普通字符、占位符、辅助控制符
普通字符: 原样输入 //不建议写占位符:
占位符定义:
占了一个位置,将输入的数据,转换为占位符指定的格式,放到地址列表对应的一块内存空间上,占位符也决定了能识别的字符的范围
占位符:
//整型
%d 将输入的数据 转换为 有符号 十进制 格式
%u 将输入的数据 转换为 无符号 十进制 格式
%x 将输入的数据 转换为 十六进制 格式
%o 将输入的数据 转换为 八进制 格式
//浮点数
%f 将输入的数据 转换为 小数的形式
%g
%e
%E
//字符
%c 以 字符的 格式 输入 //将对应的ASCII码值的字符形式输出
%s 以 字符串 格式 输入
注意:
1.第二个参数注意一定要写 & (取地址)
Segmentation fault (core dumped) //程序试图访问不能被访问的空间
2.多个除字符型数据输入时以空白符作为分割符,也可不用分割符
空白符有:空格、回车、Tab
eg: 以空格作为分割符
键盘上输入:123 456 789
scanf获取: scanf("%d%d%d",&a,&b,&c);
eg:不用分隔符(?),通过键盘给a、b、c分别赋予123、456、789
键盘上输入:123 456 789 scanf获取: scanf("%d %d %d",&a,&b,&c); //这里使用了普通字符原样输入的方式进行赋值
3.浮点型数据输入时
double -- %lf
类型要匹配
int - %d
long - %ld
long long - %lld
4.辅助控制符
m 宽度 -- 输入的宽度
达到宽度时,输入匹配结束
只能获取到前m个数据
int a;
scanf("%3d",&a);
//此时键盘上输入123456
//由于%3d,所以scanf只能获取123
5.scanf匹配结束的条件
a.空白符(读完后不取然后跳过再读取其他的)( 一个空白符 -- 匹配任意多个空白符)
1、 123 456 789
scanf("%d%d%d",&a,&b,&c); ( 一个空白符 -- 匹配任意多个空白符)
2、 123 456 789
scanf("%d%d%d",&a,&b,&c); //结果和上边的一样
b.指定宽度
123456(后边的字符留在输入缓冲区中)
scanf("%3d",&a); //123
c.非法字符(可读字符读取完遇到非法字符不再读取,非法字符及以后的字符留在输入缓冲区中)
123a45
scanf("%d",&a); //123
//因为是%d,所以a是非法字符
6. %c 字符占位符(从键盘上给 scanf()输入字符时容易出错,主要是空白符的问题)
几乎可以识别键盘输入的任何字符
scanf("%c %c %c",&c1,&c2,&c3); // 一个空白符 --匹配任意多个空白符
清除空白符的问题可用:
法一:%*c // 表示跳过一个 数据项,来跳过一个空白符
(数据项的解释:%d情形下键盘上输入123 456 789中123代表一个数据项
%c情形下键盘上输入abcd中a代表一个数据项)
法二:用getchar()来拿掉 一个空白符
练习:
编写程序从终端输入数据给到变量,
并打印变量的值
a = 3 b = 5 x = 8.5
y = 71.82 c1= 'A' c2 = 'a'
//scanf获取字符时要注意
int a,b;
float x,y;
char c1,c2;
法一:避免在键盘上敲除空格,使scanf获取空格字符
scanf("%d%d%f%f%c%c",&a,&b,&x,&y,&c1,&c2); //键盘上输入3 5 8.5 71.82Aa
//%c获取字符,不是获取字符串
法二:使用普通字符空格,来避免使用分割符空格时,使scanf获取空格字符
scanf("%d%d%f%f %c %c",&a,&b,&x,&y,&c1,&c2); //键盘上输入3 5 8.5 71.82 A a
printf("a = %d b = %d x = %g\n",a,b,x);
printf("y = %g c1 = \'%c\' c2 = \'%c\'",y,c1,c2);