在程序的运行过程中,通常需要用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互。所以在程序设计中,输入输出语句是一类必不可少的重要语句。在 C 语言中,没有专门的输入输出语句,所有的输入输出操作都是通过对标准输入输出库函数(包含在 “stdio.h” 头文件中)的调用实现。最常用的输入输出函数有 scanf()、printf()、getchar()、putchar()。
3.2.1 scanf()函数
格式化输入函数 scanf() 的功能是从键盘上输入数据,所获得的数据按指定输入格式被赋给相应的输入项。函数一般形式为:
scanf("控制字符串", 输入项列表);
其中控制字符串规定数据的输入格式,必须用双引号括起,其内容是由格式说明和普通字符两部分组成。输入项列表则由一个或多个变量地址组成,当变量地址有多个时,各个变量地址之间用逗号“,”分隔。
scanf()函数输入项列表中各变量要加取地址操作符,就是变量名前加 “&”,只有这样函数才能改变其值。输入类型与变量类型应尽量一致,已避免类型不匹配而造成的错误。
控制字符串由两个组成部分 -- 格式说明 和 普通字符。格式说明规定了输入项中的变量以何种类型的数据格式被输入,形式是:
%<修饰符>格式字符
修饰符是可选的,用以表示输入字段宽度、约定整数是短整型还是长整型、是否屏蔽输入的数据。格式字符用以约定输入数据的数据类型,如下表所示:
输入格式字符 | |||
---|---|---|---|
格式字符 | 说明 | 格式字符 | 说明 |
d | 输入一个十进制整数 | e | 输入一个指数形式的浮点数 |
o | 输入一个八进制整数 | c | 输入一个字符 |
x | 输入一个十六进制整数 | s | 输入一个字符串 |
f | 输入一个小数点形式的浮点数 |
如果需要输入一个十进制长整型数据,且规定字段宽度为 9 位有效数字,可用下面的代码完成:
long a; // 声明一个长整型变量
scanf("%91d", &a) // 输入一个字段宽度为 9 位有效数字的十进制整型数据,保存到变量 a 中
程序运行时,会要求在终端上输入数据,输入后按 Enter 键,程序继续运行。假如输入的数据是 1234567890,那么前 9 位数字将作为有效的输入,变量 a 保存的数值为 123456789。在需要屏蔽输入的某个数据时,可使用修饰符 “*”,如下例所示:
char c1, c2, c3; // 声明 3 个字符型变量
scanf("%c%*c%c", &c1, &c2, &c3); // 输入 3 个字符型数据,分别保存在变量 c1、c2、c3中,但 c2 对应的输入数据被屏蔽
当输入的数据为 abc 时,变量 c1 中保存的字符型数据为 a,变量 c3 保存的数据为 c,变量 c2 没有保存任何数据,仍然是未赋值状态。
控制字符串的普通字符主要是用作多个数据间的分隔,或者表示某种特定的输入格式。例如,通常用空格或者逗号来表示多个数据之间的分隔,如下例所示:
int a, b, c; // 声明 3 个整型变量
scanf("%d, %d, %d", &a, &b, &c); // 输入 3 个整型数据,分别保存在变量 a、b、c中
控制字符串中,3 个输入格式说明被用逗号隔开,所以如果要为变量正确赋值,输入时必须遵循这种格式,如输入 12,15,18。假如输入的数据是 12 15 18,数据间用空格分隔,那么就与规定的格式不符,上例中只有第一个变量 能被正确赋值。另外,像换行符、制表符这样的转义字符也可以被用作输入数据间的分隔。
3.2.2 printf()函数
与格式化输入函数相对应的是格式化输出函数 printf(),作用是按 “控制字符串” 规定的格式向终端输出数据。其基本格式为:
printf("控制字符串", 输出项列表);
控制字符串由格式说明和普通字符两部分组成,必须用双引号包围。格式说明一般形式为:
%<修饰符>格式字符
格式字符规定了对应输出项的输出格式,常用格式字符如下表所示:
输出 | |||
---|---|---|---|
格式字符 | 说明 | 格式字符 | 说明 |
d | 输出一个十进制整数 | e | 输出一个指数形式的浮点数 |
u | 输出一个无符号十进制整数 | g | 自动选择 f 和 e 格式中较短的形式输出 |
o | 输出一个八进制整数 | c | 输出一个字符 |
x | 输出一个十六进制整数 | s | 输出一个字符串 |
f | 输出一个小数点形式的浮点数 |
修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等,从而产生更规范整齐的输出。当没有修饰符时,以上各项按系统默认设定显示。如下例所示:
int a = 123; // 定义一个整型变量并赋值
float b = 45.6789; // 定义一个浮点型变量并赋值
printf("%5d-%5.2f", a, b); // 格式化输出变量 a 和 b,变量 a 字段宽度为 5,变量 b 在小数点前字段宽度为 5,小数点后为 2
代码中,printf()函数输出的结果为:
123- 45.68
控制字符串中输出的整数的字段宽度为 5 位,变量 a 的宽度为 3 位,不足的 2 位由空格补齐;输出的浮点型数的小数点前 5 位,而变量 b 小数点前为 2 位,不足的 3 位由空格补齐,小数点后是 2 位,而变量 b 小数点后为 4 位,输出函数会自动进行四舍五入运算。如果整型数据或浮点数整型部分对应的输出位数比实际要短,那么会被自动加长补齐。
用负号做修饰符,则可规定字段宽度在大于变量实际长度时,输出数据的对齐方式。如下例所示:
int a = 123; // 定义一个整型变量并赋值
printf("%-5\n", a); // 格式化输出变量 a,输出的数值向左对齐
printf("%5d\n", a); // 格式化输出变量 a,输出的数值向右对齐,这是默认值
输出结果:
123
123
这段代码分两行输出变量 a 的值,第一行因为使用了向左对齐的符号,所以变量 a 的值以左对齐方式输出。第二行则是以默认方式右对齐输出。
修饰符中 l 和 h 可以规定是以长型还是短型输出数据,例如 %hd 表示短整型,%lf 表示双精度浮点型,%ld 表示长整型,%hu 表示无符号短整型。
格式化输出函数还可以直接将字符串常量放在格式说明语句中输出,但通常是将字符串常量与输出格式字符组合使用,以实现各种输出效果。如下例所示:
float sec1, sec2; // 定义两个浮点型变量,表示某学生第一和第二学期的成绩
sec1 = 88.0; // 为变量赋值
sec2 = 79.5;
printf("第一学期成绩是:%2.1f\n", sec1); // 输出第一学期成绩
printf("第二学期成绩是:%2.1f\n", sec2); // 输出第二学期成绩 printf("总分是:%3.1f,平均分是:%2.1f\n",
sec1 + sec2, (sec1 + sec2) / 2); // 输出两学期的总分和平均分
输出结果:
第一个学期成绩是:88.0
第二个学期成绩是:79.5
总分是:167.5,平均分是:83.8
该代码将把格式说明语句中的字符串常量和输出项列表里的变量值一同输出。可见,输出格式字符的作用仿佛是运行时被输出项的值替换。输出项也可以是表达式,如代码第 7 行所示。另外,代码最后一行被分做两行书写,这是为了阅读方便,C 语言里是允许的。
3.2.3 getchar()函数 与 putchar() 函数
getchar()函数的作用是从终端获得一个字符,putchar()函数的作用是向终端输出一个字符。与前面介绍的两个输入输出函数不同的是,getchar() 与 putchar() 函数每次只能操作一个 ASCII 代码。因此,在设计基于文本界面的简单应用程序时,常利用这一特性实现菜单选择的输入和用户确认的输入。
getchar()没有任何参数,使用方法是直接返回一个字符。putchar()是用一个字符型数据作为参数,执行时直接将该字符型数据输出到终端上。下例将实现一个运行在终端上的文本菜单:
#include <stdio.h> int main()
{
char ch; // 声明一个字符型变量,用作接受输入
printf("如果您要输出字母 A,请输入数字 1\n"); // 输出菜单文本
printf("如果您要输出字母 B,请输入数字 2\n"); // 输出菜单文本
ch = getchar(); // 获取键盘上输入的字符 if (ch == '1') // 判读所输入的字符是否为 2
{
putchar('A'); // 输出字母 B
}
else if (ch == '2') // 判断所输入的字符是否为 2
{
putchar('B'); // 输出字母 C
}
else // 将 1 和 2 以外的字符作为非法输入处理
{
printf("您输入的字符不在选择范围\n"); // 输出错误提示
} printf("\n 按任意键退出程序"); // 操作等待提示
getchar(); // 输入任意字符后继续运行 return 0; // 程序结束
}
代码第 4 行使用 getchar() 函数将输入的字符保存在字符型变量 ch 中。第 5 行至第 13 行,根据 ch 的值判断所需执行的语句。代码第 15 行只使用了 getchar() 函数而没有变量与之相连接,程序运行到这条语句时被该函数中断执行等待输入。而输入的任何数值都不会被保存,这就是在文本界面程序中常见的用户确认功能实现方法。
注意:getchar() 与 putchar() 函数包含在头文件 stdio.h 中,使用前必须用 “#include <stdio.h>” 命令将该头文件包含在代码中,否则编译器会出现警告提示。