购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

案例2-1
我爱C语言

案例描述

本案例要求编写一个程序,在控制台输出“我爱C语言”。

知识需求

要想在控制台输出数据,需要使用输出函数,C语言中常用的输出函数为printf(),与printf()函数对应的是输入函数scanf()。下面介绍printf()函数和scanf()函数的相关知识。

知识讲解

1.printf()函数

printf()函数为C语言的标准输出函数,也称为格式化输出函数,该函数名的最后一个字符“f”表示格式(Format),其功能是按照指定的格式将数据输出到控制台。printf()函数的调用形式如下。

printf("格式控制字符串",[输出列表]);

其中,格式控制字符串用于指定输出格式,以符号“%”开头,后面有相应的格式控制字符,用于指定输出数据的类型、形式、长度、精度等。格式控制字符串的具体形式如下。

"%[标志][宽度][.精度][长度]类型"

在格式控制字符串中,标志、宽度、精度、长度等都是可选的,但“%类型”是必须要指定的。例如,以“%c”格式输出一个字符,以“%d”格式输出一个整数。下面介绍格式控制字符的相关知识。

(1)类型

printf()函数可以输出任意类型的数据,包括整型、字符型、浮点型等数据,常用的输出类型格式控制字符如表2-1所示。

表2-1 printf()函数常用的输出类型格式控制字符

使用输出类型格式控制字符可以输出不同类型的数据,示例代码如下。

printf("%c", 'H');                //以“%c”格式输出字符’H'
printf("%s", "Hello, world!\n");   //以“%s”格式输出字符串"Hello, world!"
printf("%d", 100);                //以“%d”格式输出整数100

指定输出类型后,printf()函数就会按照指定的类型输出输出列表中的数据,每一个输出类型格式控制字符对应一个参数。如果要连续输出多个数据,则要使用多个输出类型格式控制字符,示例代码如下。

printf("%d%d%d\n", 1, 2, 3);       //使用3个“%d”输出3个整数1、2、3
printf("%f\n%c\n", 2.1, 'a');      //使用“%f”与“%c”输出浮点数2.1与字符’a'

在上述代码中,第1行代码用于输出3个连续整数,1、2、3这3个整数会自动与3个“%d”按从前往后的顺序一一匹配。第2行代码也是如此,浮点数2.1会自动与“%f”匹配,字符'a'会自动与“%c”匹配。

(2)标志

printf()函数中的标志符用于规范数据的输出格式,例如左对齐、右对齐、填补空缺等,标志符有−、+、0空格、#共5种,具体如表2-2所示。

(3)宽度

宽度是用十进制整数表示的输出数据的位数。若数据的实际位数大于定义的宽度,则按定义的宽度输出;若实际位数小于定义的宽度,则不足的部分以空格或0填充。

表2-2 printf()函数的标志符

以不同的宽度输出123,示例代码如下。

printf("%d\n", 123);          //按实际位数输出
printf("%5d\n", 123);         //设置宽度为5
printf("%10d\n", 123);        //设置宽度为10

上述代码的运行结果如图2-1所示。

由图2-1可知,printf()输出的数据默认右对齐。当数据的实际位数小于设置的宽度时,左侧空缺以空格填充。也可以结合标志符调整对齐方式或者以0填充左侧的空缺,示例代码如下。

printf("%d\n", 123);
printf("%-5d\n", 123);        //添加“-”符号,左对齐输出
printf("%010d\n", 123);       //添加“0”,左侧的空缺以0填充

上述代码的运行结果如图2-2所示。

图2-1 以不同的宽度输出123

图2-2 添加标志符输出123

由图2-2可知,添加“-”符号输出的数据为左对齐;添加“0”标志符后,第3个123左侧的空缺以0填充。读者可尝试使用其他标志符输出数据,查看数据输出格式的变化。

(4)精度

精度格式以字符“.”开头,后面加十进制整数。精度主要作用于浮点型数据,表示输出数据的小数点后面的位数。如果不设置精度,则默认输出小数点后6位。如果精度作用于整型数据,则表示按照一定宽度输出数据,数据左侧空缺填充0。在使用精度输出数据时,若数据的实际位数大于定义的精度,则截去超出的部分。

使用格式控制符中的精度控制输出数据格式的示例代码如下。

printf("%f\n", 1.234567);     //默认输出小数点后6位
printf("%.8f\n", 1.234567);    //输出小数点后8位,右侧的空缺填充0
printf("%.3f\n", 1.234567);    //输出小数点后3位,截去超出的部分,截去部分进行四舍五入
printf("%.6d\n", 123);        //123的输出宽度为6,左侧的空缺填充0

上述代码的运行结果如图2-3所示。

图2-3 printf()函数按指定的精度输出数据

(5)长度

长度格式控制字符包括h、l两种,h是short的简写,表示按短数据类型输出数据;l是long的简写,表示按长数据类型输出数据。例如,hd表示输出数据的类型为short int,ld表示输出数据的类型为long int,short int与long int所占的内存大小不同,它们所能表示的数据范围也不同。以hd格式和ld格式输出同一个数据时,如果数据不超出short int的范围,两者的输出结果并无差别;如果数据超出short int的范围,则两者的输出结果就有差别。

长度格式控制字符输出的示例代码如下。

printf("%d\n", 123);      //正常输出
printf("%hd\n", 123);     //按短数据类型输出
printf("%lf\n", 1.23);    //按长数据类型输出

长度格式控制字符在printf()函数中不常使用,读者了解即可。

2.scanf()函数

scanf()函数用于读取用户从键盘输入的数据,它可以灵活接收各种类型的数据,例如字符串、字符、整数、浮点数等。scanf()函数也可以通过格式控制字符控制输入的内容,但只使用类型格式控制字符(如“%d”“%c”“%f ”等),并不使用宽度、精度、标志等格式控制字符。scanf()函数的类型格式控制字符的用法与printf()函数一样。

scanf()函数用法的示例代码如下。

int a;
char c;
float f;
scanf("%d", &a);      //接收一个从键盘输入的整型数据
scanf("%c", &c);      //接收一个从键盘输入的字符型数据
scanf("%f", &f);      //接收一个从键盘输入的浮点型数据

在调用scanf()函数时,参数变量的前面有一个“&”符号。这是取地址运算符,用于获取已定义变量的存储地址,将从键盘输入的数据存储到相应变量中。该符号将在第5章讲解。

在使用scanf()函数获取用户输入的数据时,如果输入的数据中包含终止符,scanf()函数就认为输入结束。例如,使用scanf()函数输入一个字符串,并将其存储到数组中,示例代码如下。

char arr[20];         //定义字符数组arr,大小为20
scanf("%s", &arr);    //获取输入的字符串,并将其存储到数组arr中

执行上述代码,获取输入的字符串时,如果输入“Hello world”,程序只会读取到“Hello”,后面的“world”不会被读取。这是因为“Hello world”中包含一个空格,空格是终止符,scanf()只能读取到空格之前的内容。

C语言中常见的终止符如表2-3所示。

表2-3 C语言中常见的终止符

后面的章节中会经常调用scanf()函数获取从键盘输入的数据,读者可慢慢熟练掌握scanf()函数的使用方法。在这里,读者了解scanf()的调用方法即可。

小提示

在使用Visual Studio 2019调用scanf()函数时,因为scanf()函数是一个不安全的函数,Visual Studio 2019对其检查比较严格,所以编译可能不会通过,会提示scanf()函数不安全,此时需要关闭安全检查。要关闭安全检查,需要在源代码文件最顶部添加“#define _CRT_SECURE_NO_WARNINGS”。需要注意的是,必须在文件最顶部添加,添加在其他地方无效。

C11标准使用scanf_s()函数代替scanf()函数。scanf_s()函数是一个安全函数,但它是C11标准新增加的函数,目前还有很多编译器不支持。本书为了提高代码的可移植性,仍使用scanf()函数获取从键盘输入的数据。

案例实现

1.案例设计

在本案例中,调用printf()函数分别输出“我”“爱”“C”“语”“言”,即可在控制台输出“我爱C语言”。

2.完整代码

1  #include <stdio.h>
2  #include <stdlib.h>
3  int main()
4  {
5     printf("我");
6     printf("爱");
7      printf("C");
8     printf("语");
9     printf("言");
10     return 0;
11 }

上述代码的运行结果如图2-4所示。

图2-4 案例2-1的运行结果 dv+qwooDykaOMomsJX30KKu8FT2k7hE+WioQ1saJ2fk3+aeHzGQy6UdBiF6bBM8t

点击中间区域
呼出菜单
上一章
目录
下一章
×