输入输出
函数三要素:功能、参数、返回值
1 按字符输入输出
1.1 按字符输出putchar()
1.1.1 介绍
int putchar(int c);
功能:向终端输出一个字符
参数:c:要输出字符的ASCII值
返回值:要输出字符的ASCII值。当输出错误的时候,返回EOF(end of file)文件结束标志
1.1.2 用法
1.2 按字符输入getchar()
1.2.1 介绍
int getchar(void);
功能:读取终端用户输入的一个字符
参数:无
返回值:输入字符的ASCII值。如果达到文件末尾或者发生错误,则返回EOF。
1.2.2用法
int c ;c = getchar(); //用变量c去接收getchar函数的返回值,函数调用完之后,c里面就是输入字符的ASCII值了。
putchar(c); //打印输入的这个字符
但是如果调用两次getchar(),用户按键的回车会被第二次调用的getchar()接收到
int c;
c = getchar();
// getchar(); //可以把输入的回车给吃掉
putchar(c);
c = getchar();
putchar(c);
解决这个问题可以在后面加个getchar();
练习1:用getchar、putchar实现大写字母转换成小写字母(参考答案见本文最下方)
2 按格式输入输出
2.1 按格式输出printf()
2.1.1 介绍
int printf ( const char * format , ...);功能:按照指定格式向终端输出
参数:format: 用双引号括起来的格式控制串和输出表
返回值:输出字符的个数(不常用)
2.1.2 格式
printf("格式控制串", 输出表);
格式控制串:包含两种信息
- 普通字符:原样输出
- 格式说明: 修饰符%后面加格式字符,用于指定输出格式。
输出表:要按照格式输出的数据(可以没有,多个时以逗号分隔)
例如:
格式字符:
%d int
%ld long
%f float
%lf double
%c char
%s 字符串
%#x 十六进制
%#o 八进制
%u 十进制无符号整数
%e 指数
%p 地址
2.2 %m.n含义
.n: 对实数,指定小数点后几位(四舍五入)
对字符串,指定实际输出位数
m: 位宽,输出数据域宽,数据长度<m,左补空格,否则按实际输出
-: 左对齐,默认右对齐
0: 输出数值时指定左边不使用的空位置自动填充0
#include<stdio.h>
int main()
{
int a = 123;
float b = 12.345;
char c = 'a';
printf("%2d,%8d,%08d,%-8d\n", a, a, a, a);
printf("%f,%10f,%8.2f,%08.2f\n", b, b, b, b);
printf("%c,%3c,%-10c\n", c, c, c);
printf("%s,%10.2s,%-10s", "hello", "hello", "hello");
}
打印结果:
2.3 按格式输入 scanf()
2.3.1 介绍
int scanf ( const char * format , ...);功能: 按格式从终端输入
参数:类似printf
返回值: 正确输入数据的个数。当第一个输入数据格式不正确时,会直接返回0。
2.3.2 格式
scanf("格式控制串", 地址表);
地址表:变量的地址,常用取地址运算符&
格式字符如同printf
int a , b ;scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
注意:使用scanf时""中不要写提示语句,不然输入的时候需要按原样输入才能输入成功。
2.3.3 输入分隔符的指定
一般以空格、TAB或回车键作为分隔符
其他字符作为分隔符:格式串中两个格式符间字符
【例】输入12 34或者12回车34
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
例如中间用逗号隔开: 输入12,34才能成功输入
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b;
scanf("%d,%d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
练习2:一个水分子的质量约为3.0*10^-23g,1夸脱水大约有950g,
编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。(答案见本文最下方)
注意:scanf函数输入回车问题: 多次输入字符,回车会被下次的%c接收到。其他格式不会出现这种问题。
(1)连续输入两个char类型:
char a, b;
scanf("%c", &a);
printf("%c\n", a);
scanf("%c", &b);
printf("%c\n", b);
第二次会读到回车
(2)先输入int类型再输入char类型:
int a;
char b;
scanf("%d", &a);
//getchar();
printf("%d\n", a);
scanf("%c", &b);
printf("%c\n", b);
第二次会读到回车
(3)连续输入两个int类型
int a;
int b;
scanf("%d", &a);
printf("%d\n", a);
scanf("%d", &b);
printf("%d\n", b);
因为第二次是int类型不会存在读到上次回车问题
综上:只要第二次像输入char类型就会产生垃圾字符问题。
2.4 回收垃圾字符
2.4.1 getchar()
只能回收任意一个字符,一般可以用于循环里面
char a;
scanf("%c", &a);
getchar();
printf("%c\n", a);
scanf("%c", &a);
printf("%c\n", a);
2.4.2 %*c
只能回收任意一个字符
char a;
scanf("%c", &a);
printf("%c\n", a);
scanf("%*c%c", &a);
printf("%c\n", a);
2.4.3 可以通过空格回收
可以回收一个或多个空格、回车、tab
char a;
scanf("%c", &a);
printf("%c\n", a);
scanf(" %c", &a);
printf("%c\n", a);
天才预设的上一篇跳转路径:C语言基础2——运算符和表达式-CSDN博客
天才预设的下一篇跳转路径:C语言基础4——控制语句1(分支)-CSDN博客
练习答案
练习1:用getchar、putchar实现大写字母转换成小写字母
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = getchar();
putchar(a + 32);
putchar(10);
return 0;
}
练习2:一个水分子的质量约为3.0*10^-23g,1夸脱水大约有950g,
编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。(答案见本文最下方)
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num;
scanf("%d", &num);
printf("%e\n", num * 950 / 3.0e-23);
return 0;
}