C语言程序中,既可以接收用户从键盘输入的数据,也可以将运行结果输出到屏幕上。
C 语言标准库提供了很多种完成输入和输出操作的语句,包括 getchar()、get()、scanf()、putchar()、puts() 和 printf()。
使用这些输入输出语句时,要在程序的开头引入<stdio.h>
:
#include <stdio.h>
输出语句
1) putchar()
putchar() 专门用来输出指定的一个字符。
举个例子:
#include <stdio.h>
int main() {
putchar('A'); //输出字符 'A'
return 0;
}
运行结果为:
A
putchar() 还可以输出某个字符型变量的值,例如:
#include <stdio.h>
int main() {
char c = 'A';
putchar(c); //输出c的值
return 0;
}
运行结果和上面程序相同。
2) puts()
puts() 专门用来输出一个字符串。所谓字符串,就是用双引号" "
括起来的多个字符(≥0),比如 “ABC”、”http://www.weixueyuan.net/” 等。
例如:
#include <stdio.h>
int main() {
puts("http://www.weixueyuan.net");
return 0;
}
运行结果为:
http://www.weixueyuan.net注意," "
双引号只是 C 语言表示字符串的方式,输出的字符串不会带双引号。
3) printf()
printf() 不仅可以输出字符和字符串,还可以输出整数、小数等各种类型的数据。
printf() 可以直接输出一个字符串,例如:
#include <stdio.h>
int main() {
printf("http://www.weixueyuan.net");
return 0;
}
printf() 还有更高级的用法,需要套用如下的格式:
printf(格式控制字符串 , 数据1 , … , 数据n);数据1~数据n 表示要输出的 n 个数据,可以是整数、小数、字符、字符串等,也可以是变量或者表达式。
格式控制字符串本质是" "
双引号包裹的字符串,双引号内可以包含两种信息:
- 普通字符:printf() 会原样输出这些字符。
- 格式控制符:又称占位符,作用是将数据1~数据n 按照指定的格式输出。
C 语言提供的格式控制符有很多,如下表所示:
格式控制符 | 说 明 |
---|---|
%c | 输出一个字符。 |
%hd、%d、%ld | 以十进制、有符号的形式分别输出 short、int、long 类型的整数。 |
%hu、%u、%lu | 以十进制、无符号的形式分别输出 short、int、long 类型的整数。 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式分别输出 short、int、long 类型的整数。 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式分别输出 short、int、long 类型的整数。 |
%hx、%x、%lx %hX、%X、%lX | 以十六进制、不带前缀、无符号的形式分别输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
%#hx、%#x、%#lx %#hX、%#X、%#lX | 以十六进制、带前缀、无符号的形式分别输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
%f、%lf | 以十进制的形式分别输出 float、double 类型的小数。 |
%e、%le %E、%lE | 以指数的形式分别输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
%g、%lg %G、%lG | 以十进制和指数中较短的形式分别输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 |
%s | 输出一个字符串。 |
有些格式控制符,还可以在 % 的后边插入以下修饰符:
修饰符 | 说 明 |
---|---|
– | 适用所有控制符,输出的数字或字符向左对齐。 |
m(代表一个正整数) | 适用所有控制符,指定数据最小输出宽度,也就是至少占用几个字符的位置。 |
.n(n 代表一个正整数) | 可用于浮点型的格式控制符,表示保留 n 位小数。 也可以用于 %s,表示输出字符串中前 n 个字符。 |
举个简单的例子:
#include <stdio.h>
int main() {
int n = 1, m = 2, t = 3;
printf("n=%5d,m=%d\n",n,m); //输出的 n 占用 5 个字符的长度
printf("n=%-5d,m=%d,t=%d\n", n,m,t); //输出的 n 占用 5 个字符的长度,且左对齐
float f = 1.23456;
printf("f=%f\n", f); //正常输出一个小数
printf("f=%.2f\n", f); //输出一个小数,小数位数保留 2 位
return 0;
}
运行结果为:
n= 1,m=2
n=1 ,m=2,t=3
f=1.234560
f=1.23
使用 printf() 时,需要注意以下几点:
- 输出数据时,一定要使用相匹配的格式控制符,否则程序运行会错误;
- printf() 的格式控制字符串中可以包含转义字符,比如 ‘\n’ 换行符、’\t’ 水平制表符等;
- 如果想使用 printf() 输出字符
%
,应该在格式控制字符串中连续用两个%
表示。
输入语句
1) getchar()
getchar 是“get character”(获取字符)的缩写,可以接收用户输入的一个字符。
例如:
#include <stdio.h>
int main() {
char c = getchar();
putchar(c);
return 0;
}
程序运行后,任意输入一个字符,getchar() 会读取这个字符并赋值给字符变量 c。运行结果是:
A↙
A
↙
表示按下 Enter 回车键。
getchar() 读取到的字符可以赋值给一个字符变量,也可以不赋给任何变量,例如:
#include <stdio.h>
int main() {
putchar(getchar());
return 0;
}
程序中,getchar() 读取用户输入的字符后,putchar()语句直接将接收到的字符输出,程序的运行结果和上面程序完全相同。
2) gets()
gets() 可以一次性接收用户输入的多个(≥1)字符。
举个例子:
#include <stdio.h>
int main() {
char str[100]; //存储多个字符的变量
gets(str); //接收多个字符
puts(str); //输出接收到的字符
return 0;
}
str 是一个字符数组,可以存储多个字符。gets() 将接收到的字符存储到 str 中,puts() 会将 str 中的字符全部输出。程序的运行结果为:
abc↙
abc
3) scanf()
scanf() 可以接收任何类型的数据,完全可以替代 getchar() 和 gets()。
scanf() 的用法和 printf() 类似,需要套用如下格式:
scanf(格式控制字符串 , 地址1, … , 地址n);地址1 ~ 地址n 通常是变量的首地址。C语言中,变量的地址可以用&
获取,例如&a
表示获取 a 变量的首地址。
格式控制字符串表示以固定的格式读取用户输入的数据,内部可以包含两部分内容:
- 普通字符:scanf() 会原样读取这些字符;
- 格式控制符:表 1 中罗列的所有格式控制符,完全适用于 scanf()。
有些格式控制符,%
后面可以插入下表所示的修饰符:
修饰符 | 说 明 |
---|---|
m(代表一个正整数) | 限制最多读取的字符数量。 |
* | 丢弃读到的数据。 |
例如:
#include <stdio.h>
int main() {
int n, m;
char c;
scanf("%c", &c);//读取一个字符存到变量 c 中
scanf("n=%2d", &n); //读取长度为 2 的整数存到变量 n 中
scanf("%d", &m); //读取一个整数存到变量 m 中
printf("c=%c,n=%d,m=%d", c, n, m);
return 0;
}
运行结果为:
An=34567↙
c=A,n=34,m=567使用 scanf() 时,需要注意以下几点:
- scanf() 需要的是变量的地址,而不是变量名;
- 在格式控制字符串中,如果除了格式控制符外还有其它普通字符,那么输出数据时必须在对应的位置上输入这些字符;
- 使用
%c
读取一个字符时,空格和转义字符都会作为有效字符被读取; - scanf()读取数据时,一旦遇到不符合格式控制字符串要求的字符,就会立即终止读取。