根据书中案例,我们来编写一个程序样例:在一行打印30个星号的函数,并在一个打印表头的程序中使用该函数。
#include <stdio.h>
#define NAME "Mr. Positive Energy IT"
#define ADDRESS "Beijing Dongchengqu"
#define PLACE "China Air, CA 9999"
#define WIDTH 30
void starbar(void); /* 函数原型 */
int main(void)
{
starbar();
printf("%s\n", NAME);
printf("%s\n", ADDRESS);
printf("%s\n", PLACE);
starbar(); /* 使用函数 */
return 0;
}
void starbar(void) /* 函数的内容定义 */
{
int count;
for (count = 1; count <= WIDTH; count++)
putchar('*');
putchar('\n');
}
以下程序输出结果:
上面的函数我们定义了一个叫starbar的函数,并且在后面对函数进行了定义解释,函数原型(function prototype)告诉编译器函数starbar()的类型;使用函数表明在此处执行函数;函数的定义内容(function definition)明确地指定了函数要做哪些事:
当计算机执行到starbar();语句时,会找到该函数的定义并执行其中的内容。执行完starbar()中的代码后,计算机返回主调函数(calling function)继续执行下一行(本例中,主调函数是main())。
函数参数
在上边的程序中我们看到了定义的*的函数,但是我们发现输出结果并不是很好看,没有做到居中的效果。我们可以使用在每个输出字符前插入N个空格,这样就可以居中了,那么刚好展开讲解一下如何在函数中插入参数。这和打印一定数量的星号(starbar()函数)类似,只不过现在要打印的是一定数量的空格。虽然这是两个任务,但是任务非常相似,与其分别为它们编写一个函数,不如写一个更通用的函数,可以在两种情况下使用。
设计一个新的函数show_n_char()(显示一个字符n次)
假设可用的空间是40个字符宽。调用show_n_char(‘*’, 40)应该正好打印一行40个星号,就像starbar()之前做的那样。第2行Mr. Positive Energy IT的空格怎么处理?Mr. Positive Energy IT是21个字符宽,所以第1个版本中,文字后面有19个空格。为了让文字居中,文字的左侧应该有9个空格,右侧有10个空格。因此,可以调用show_n_char(‘ ‘, 9),但是每次都要根据数据量去数字符和自己去算空间大小岂不是有点蠢了。所以大家仔细看下列程序处理地址时候的位置。
#include <stdio.h>
#include <string.h>
#define NAME "Mr. Positive Energy IT"
#define ADDRESS "Beijing Dongchengqu"
#define PLACE "China Air, CA 9999"
#define WIDTH 40
#define SPACE ' '
void show_n_char(char ch, int num);
int main(void)
{
int spaces;
show_n_char('*', WIDTH); /* using constants as arguments */
putchar('\n');
show_n_char(SPACE, 9); /* using constants as arguments */
printf("%s\n", NAME);
spaces = (WIDTH - strlen(ADDRESS)) / 2;
/* Let the program calculate */
/* how many spaces to skip */
show_n_char(SPACE, spaces);/* use a variable as argument */
printf("%s\n", ADDRESS);
show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2);
/* an expression as argument */
printf("%s\n", PLACE);
show_n_char('*', WIDTH);
putchar('\n');
return 0;
}
/* show_n_char() definition */
void show_n_char(char ch, int num)
{
int count;
for (count = 1; count <= num; count++)
putchar(ch);
}
上述程序中的输出结果:
为什么地址和后边的数据不用进行计算了呢,那大家来分析这部分内容:这个就是自动计算了需要跳过多少个空格啦!
声明函数原型的方式
在使用函数之前,要用ANSI C形式声明函数原型:
void show_n_char(char ch, int num);
当函数接受参数时,函数原型用逗号分隔的列表指明参数的数量和类型。根据个人喜好,你也可以省略变量名:
void show_n_char(char, int);
在原型中使用变量名并没有实际创建变量,char仅代表了一个char类型的变量,以此类推。
注意,ANSI C要求在每个变量前都声明其类型。也就是说,不能像普通变量声明那样使用同一类型的变量列表:
void touda(int x, y, z) /* 无效的函数头 */
void touda(int x, int y, int z) /* 有效的函数头 */