目录
1. 按字符输入输出
1.1 按字符输出putchar()
1.1.1 介绍
#include
int putchar(int c);
-
功能:向终端输出一个字符
-
参数:c:要输出字符的ASCII值
-
返回值:要输出字符的ASCII值。当输出错误的时候,返回EOF(end of file)文件结束符号。
1.1.2 用法
int a=10;
putchar('A');
putchar(66);
putchar('\n');
putchar(10);
putchar('a'-32);
putchar('A'+32);
putchar(a);
输出结果:
AB
Aa
1.2 按字符输入getchar()
1.2.1 介绍
#include
int getchar(void);
-
功能:向终端输入一个字符
-
参数:无
-
返回值:输入字符的ASCII值。如果发生错误返回EOF。
1.2.2 用法
例子:
int ch = getchar();//ch里面存放的是输入字符的ascii值
putchar(ch);
但是如果连续按字符输入输出两次,第一次输入的回车会被第二次的getchar()接收到。例子:
int n, m;
n = getchar();
//getchar();
m = getchar();
putchar(n);
putchar(m);
注意🚨:后面输入多余的字符会放在输入缓存区中等待输入。如果后面遇见输入功能的函数,则会完成输入。也就是我们敲的回车也会放在输入缓冲区等待输入。如果要解决可以在后面跟一个getchar()去吃掉按下的回车。
练习:用getchar、putchar实现大写字母转换成小写字母
int a = getchar();
putchar(a - 32);
putchar(10);
2. 按格式输入输出
2.1 按格式输出ptrintf()
2.1.1 介绍
#include
int printf(const char *format, ...);
-
功能:按指定格式向终端输出
-
参数:format:用双引号括起来的格式控制串和输出表。
-
返回值:输出字符的个数(不常用)
2.1.2 格式
printf(“格式控制串”,输出表);
-
格式控制串:包含两种信息。
- 普通字符:原样输出。
- 格式说明:修饰符%后面加格式字符,用于指定输出格式。
-
输出表:要输出的数据(可以没用,如果多个要用","分隔)。
例子:
int a=10,b=20;
printf("a=%d b=%d\n",a,b);
格式字符:
%d int,%ld long,%f float,%lf double,%c char,%s 字符串,%x 十六进制,%o 八进制,%u 十进制无符号正数,%p 地址,%e 指数,%m.nf 含义:,m:位宽,.n:打印小数点后几位,-:左对齐,默认右对齐,0:指定左边不使用的空位自动填充0
#include
int main()
{
int a=123;
float b=12.456;
char c='a';
printf("%2d,%8d,%08d,%-8d\n",a,a,a,a);
printf("%f,%10f,%3.2f,%.2f\n",b,b,b,b);
printf("%c,%3c,%-3c\n",c,c,c);
}
输出:
123, 123,00000123,123
12.456000, 12.456000,12.46,12.46
a, a,a
2.2 按格式输入 scanf()
2.2.1 介绍
#include
int scanf(const char *format, ...);
-
功能:按格式从终端输入
-
参数:同printf
-
返回值:正确输入数据的个数。如果当第一个数据格式不正确的时候,会直接返回0。
2.2.2 格式
scanf(“格式控制串”,地址表);
-
地址表:变量的地址,常用取地址符&
-
格式字符:d,o,x,u,c,s,f,e
例如:
int a,b;
scanf("%d%d",&a,&b);
printf("%d %d\n",a,b);
注意🚨:用scanf时“”中不要写上除了格式控制字符以外的东西,除非输入的时候要按原样输入才可以。
拓展📢:printf、sprintf、fprintf 三者区别
都是把格式好的字符串输出,只是输出的目标不一样:1、printf,将格式字符串输出到标准输出(一般是屏幕)。
2、sprintf,将格式字符串输出到指定字符串中,所以参数比printf多一个char*。
3、fprintf, 将格式字符串输出到指定文件中,所以参数比printf多一个文件流指针FILE*。
man手册给出的函数参数👇
int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, …);
int sprintf(char *str, const char *format, …);其中将整数转换为字符串可以用sprintf 实现,如下
2.2.3 输入分隔符的指定
一般以空格、TAB或者回车作为分隔符
要想用其他字符作为分隔符:格式串中添加要设置的分隔字符
例如:中间用逗号分隔开:
int a, b;
scanf("%d,%d", &a, &b);
printf("%d\n%d",a,b);
练习:一个水分子的质量约为3.0*10^-23g,1夸脱水大约有950g,编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。表示:3.0e-23 打印格式:%f或%e 。
int num;
scanf("%d",&num);
printf("%e\n",num*950/3.0e-23);
注意🚨📢:
scanf函数输入回车符的问题,当用%c方式输入字符时,回车符会被下次的%c接收到。其他给格式不会出现这种问题。
例1:连续输入两个char类型数据:
char a,b;
scanf("%c",&a);
printf("%c\n",a);
scanf("%c",&b);
printf("%c\n",b);
第二个scanf会读到回车
例2:连续输入两个int类型数据:
int a,b;
scanf("%d",&a);
printf("%d\n",a);
scanf("%d",&b);
printf("%d\n",b);
因为两次输入的都是int类型,下次输入就不会读到char类型的回车。
例3:先输入一个int类型数据,再输入char类型数据:
int a;
char b;
scanf("%d",&a);
//getchar();
printf("%d\n",a);
scanf("%c",&b);
printf("%c\n",b);
第二个scanf会直接读到回车
解决🛠️:可以在后面加个getchar()吃掉回车。
2.3 垃圾字符回收
(1)通过空格回收:
可以回收一个或多个空格、回车、tab
scanf("%c",&c1);
printf("%c\n",c1);
scanf(" %c",&c2);
printf("%c\n",c2);
(2)%*c
只能回收任意一个字符
scanf("%c",&c1);
printf("%c\n",c1);
scanf("%*c%c",&c2);
printf("%c\n",c2);
(3)getchar()
只能回收任意一个字符
scanf("%c",&c1);
printf("%c\n",c1);
scanf("%*c%c",&c2);
printf("%c\n",c2);