参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》。
赋值语句
在赋值表达式的尾部加上一个分号,就构成了赋值语句。
注意:变量定义时赋初值和赋值语句不相同。
数据输出
把数据从计算机内部送到计算机外部设备上的操作称为输出,从计算机外部设备将数据送入计算机内部的操作称为输入。
printf函数的一般调用形式
printf函数是C语言提供的标准输出函数。
printf函数的调用形式如下:
printf(格式控制,输出项1,输出项2,……)
格式控制是字符串形式。
格式控制可由三部分组成:
- 字面常量文本:在格式字符串中精确地显示输入。
- 转义序列:提供特殊的格式控制。转义序列由反斜杠(\)和一个单独的字符组成。一般而言,反斜杠告诉printf函数以特殊的方式解释下一个字符。
- 格式说明:由百分号(%)和一个转换字符组成。
在printf函数调用后加上分号,则构成输出语句。例如:
printf("a = %d, b = %d", a, b);
printf函数中格式控制有以下两种作用:
- 给输出项提供输出格式说明。
- 提供需要原样输出的文字或字符。
程序示例1:
#include <stdio.h>
main()
{
int i = 2518;
double a = 3.1415;
printf("i = %d, a = %f, a * 10 = %e\n", i, a, a*10);
}
运行后输出的结果为:1=2518,a=3.141500,a*10=3.141500e+01。
注意:使用printf()的程序都必须包含stdio.h头文件。
printf函数中常用的格式说明
格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之前可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。
格式字符
格式字符 | 说明 |
---|---|
c | 输出一个字符。 |
d或i | 输出带符号的十进制整型数。 |
o | 以八进制格式输出整型数。%o不带先导0,%#o加先导0。 |
x | 以十六进制格式输出整型数。%x不带先导0x,%#x带先导0x。 |
u | 以无符号十进制形式输出整型数。 |
f | 以带小数点的数学形式输出浮点数(单精度数和双精度数)。 |
e | 以指数形式输出浮点数(单精度数和双精度数)。 |
g | 由系统决定采用%f格式还是采用%e格式输出,以使输出宽度最小。 |
s | 输出一个字符串,直到遇到“\0”。 |
p | 输出变量的内存地址。 |
% | 也就是“%%”的形式,输出一个%。 |
长度修饰符
在%号和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。
例如,对于短整型数可以加h,即%hd,对于长整型数可以加l,即%ld,对于长长整型可以加ll。
输出数据所占的宽度说明
当使用%d,%c,%f,%e……的格式说明时,输出数据所占的宽度(域宽)由系统决定,通常按照数据本身的实际宽度输出,前后不加空格,并采用右对齐的形式。也可以用以下方式人为控制输出数据所占的宽度:
在%和格式字符之间插入一个整数常数来指定输出宽度n(例如%4d,n代表4)。
对于float和double类型的实数,可以用n1.n2的形式来指定输出宽度(n1和n2分别代表一个整数常数),其中n1指定输出数据的宽度(包括小数点),n2指定小数点后小数位的位数,所以n2也称精度(例如%12.4f,n1代表整数12,n2代表整数4)。
输出数据左对齐
由于输出数据都隐含右对齐,如果想左对齐,可以在%和宽度之间加一个“-”来实现。
使输出数据总带+号或-号
如果要每一个数前面都带正负号,可以在“%”和格式字符间加一个“+”来实现。
使用printf函数时的注意事项
- printf的输出格式为自由格式,是否在两个数之间留逗号、空格或回车,完全取决于格式控制,如果不注意,很容易造成数字连在一起,使得输出结果没有意义。
- 格式控制中必须含有与输出项一一对应的输出格式说明,类型必须匹配。若格式说明与输出项的类型不一一对应匹配,则不能正确输出,而且编译的时候不会报错。在这种情况下,若格式说明个数少于输出项个数,则多余的项不会输出;若格式说明个数多于输出项个数,则将输出一些毫无意义的数字乱码。
- 在格式控制中,除了前面要求的输出格式,还可以包含任意的合法字符,这些字符输出时将原样输出。此外,还可以利用\n(回车)、\r(回行但不回车)等控制输出格式。
- printf函数有返回值,返回值是本次调用输出字符的个数,包括回车等控制符。
- 尽量不要在输出语句中改变输出变量的值。
- 输出数据时的域宽可以改变。
使用puts()显示消息
puts()也可用于在屏幕上显示文本消息,但它不能显示数值变量。
puts()函数只需要一个字符串作为参数,在该字符串的末尾自动地添加换行符,并将其显示在屏幕上,例如:
puts("QNKCDZO");
使用puts()的程序也需要包含stdio.h。
数据输入
scanf函数是C语言提供的标准输入函数。
scanf函数的一般调用形式
scanf函数的一般调用形式如下:
scanf(格式控制,输入项1,输入项2,……)
在scanf函数调用之后加上分号,则构成输入语句。
例如,若k为int型变量,a为float型变量,y为double型变量,可通过以下函数调用语句进行输入:
scanf("%d%f%lf", &k, &a, &y);
格式控制的主要作用是指定输入时的数据转换格式,即格式转换说明。scanf的格式转换说明与printf的类似,也是由%开始,其后是格式字符。
输入项之间要用逗号隔开。对于数值型变量,在变量之前必须加&符号作为输入项(&符号是C语言中的求地址运算符)。
scanf函数中常用的格式说明
每个格式说明都必须用“%”开头,以一个“格式字符”作为结束。
格式字符 | 说明 |
---|---|
c | 输入一个字符。 |
d | 输入带符号的十进制整型数。 |
i | 输入整型数,可以是带先导0的八进制数也可以是带先导0x的十六进制数。 |
o | 以八进制格式输入整型数,可以带先导0,也可以不带。 |
x | 以十六进制格式输入整型数,可以带先导0x,也可以不带。 |
u | 以无符号十进制形式输入整型数。 |
f(lf) | 以带小数点的数学形式或指数形式输入浮点数(单精度用f,双精度用lf)。 |
e(le) | 同上。 |
s | 输入一个字符串,直到遇到“\0”。 |
说明:
- 在格式串中,必须含有与输入项一一对应的格式说明转换符。若格式说明与输入项的类型不一一对应匹配,则不能正确输入,而且编译时不会报错。
- 在VC环境下,输入short型整数,格式控制要求用%hd。要输入double型数据,格式控制必须用%lf(或%le)。
- 在scanf函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以对实数指定小数位的宽度。
- 由于输入是一个字符流,scanf从这个流中按照格式控制指定的格式解析出相应数据,送到指定地址的变量中。当输入的数据多于输入项时,多余的数据等待下一个输入操作语句继续从此输入流读取数据。
- scanf函数有返回值,其值就是本次scanf调用正确输入的数据项的个数。
通过scanf函数从键盘输入数据
输入数值型数据
在输入整数或实数这类数值型数据时,输入的数据之间必须用空格、回车符、制表符(Tab键)等间隔符隔开,间隔符个数不限。
只要能把数据正确输入,就可以按任何形式添加间隔符。
指定输入数据所占的宽度
可以在格式字符前加入一个正整数指定输入数据所占的宽度,不过不提倡这样做。
跳过某个输入数据
可以在%和格式符之间加入“*****”号,作用是跳过对应的输入数据。例如:
int x, y, z;
scanf("%d%*d%d%d", &x, &y, &z);
printf("%d %d %d\n", x, y, z);
若是输入12 34 56 78,则输出是12 56 78,跳过了34。
在格式控制字符串中插入其他字符
scanf函数中的格式控制字符串是为了输入数据用的,不会将字符输出到屏幕上。因此若想在屏幕上输出提示信息,应该首先使用printf函数输出。
如果在scanf函数中,在每个格式说明之间加一个逗号作为通配符:
scanf("%d,%d,%d", &x, &y, &z);
则输入数据时必须在两个数据后面紧跟一个逗号,否则就不能正确读入数据。
复合语句和空语句
复合语句
在C语言中,一对花括号“{}”不仅可以用作函数体开头和结尾的标志,也可以用作复合语句的开头和结尾的标志。复合语句也可称为块,其语句形式如下:
{语句1 语句2 …… 语句n}
用一对花括号把若干语句括起来构成一个语句组。一个复合语句在语法上视为一条语句,在一对花括号内的语句数量不限,如:
{a++; b *= a; printf("b = %d\n", b);}
空语句
如果只有一个分号,那么这个分号也是一条语句,称为“空语句”,程序执行时不产生任何动作。
程序举例
例(《全国计算机等级考试二级教程——C语言程序设计》P32例3.1。稍微改动了一下,注释都是我加的):
#include <stdio.h>
main()
{
int x, y, t; //定义x,y,z三个整型变量
printf("Enter x & y :\n"); //输出提示信息
scanf("%d%d", &x, &y); //从键盘输入两个整数
printf("x = %d y = %d\n", x, y); //输出原始数据
//以下三行交换x与y的值
t = x;
x = y;
y = t;
printf("x = %d y = %d\n", x, y); //输出交换后的数据
}