6.2.2 函数的嵌套调用

函数的嵌套调用是指在多个函数中,实现函数之间的互相调用。例如,在程序中,分别定义了自定义函数a()和函数b()。但是,为了实现某一个功能,在函数a()中调用了函数b()或者两个函数之间互相调用。这样,就能够非常方便地实现函数间的运行切换。例如,在实例程序中,分别定义set()和get()两个函数,并且在函数set()中设置变量的值。当设置完成以后,便直接调用函数get()将这些变量值输出。具体代码如下:

void set(char *p); //声明自定义函数
void get();
char ch1[15]; //定义全局变量
#include<stdio.h> //包含标准输入/输出头文件
#include<string.h> //包含于字符串处理相关的头文件
main() //主函数
{
    char ch[15]; //定义字符数组变量
    printf("请用户输入一串字符:\n"); //输出提示语
    scanf("%s",&ch); //获取用户输入的数据
    set(ch); //设置字符串
    return 0; //程序正常返回
}
void set(char *p) //实现字符串的设置功能
{
    printf("正在设置字符串:\n"); //输出提示语
    for(int i=0;i<=15;i++) //使用for循环
    {
        strcpy(&ch1[i],p); //循环复制字符数据
        p++; //使字符指针自加,以便循环移动指针
    }
    printf("字符串设置完毕!\n"); //输出提示语
    get(); //输出字符串
}
void get() //实现字符串的输出功能
{
    printf("正在输出字符串:\n"); //输出提示语
    printf("%s\n",ch1); //输出字符串数据
}

在实例代码中,首先对自定义函数set()和get()进行了声明。并且在主函数中,提示用户输入一个字符串,程序会将该字符串保存在字符数组ch中。然后,再将该字符数组的首地址作为自定义函数set()的参数,并通过代码段“set(ch);”调用函数set()实现字符串数据的设置。

在自定义函数set()中,通过一个for循环结构结合函数strcpy()将字符指针参数所指向的字符数据循环复制到全局字符数组变量ch1中保存。当字符数据保存完毕之后,用户直接在该函数中调用了另一个函数get()实现数据的输出显示。

注意 在程序中,使用与字符数据处理相关的函数时,必须在实例程序中包含与之相关的头文件“string.h”。否则,函数将调用失败。

图6.5 实例程序的运行结果

程序运行后的结果如图6.5所示。

如果还需要实现更多的函数嵌套功能,可以根据该实例程序进行改写。但是,在修改过程中,必须注意各个函数之间的调用情况,避免发生函数的调用顺序混乱等错误。例如,用户将打电话时,常用的三个步骤,即拨号、等待以及通话,分别放置到三个自定义函数中。再通过函数的嵌套调用方式将这三个分散的步骤重新联系起来。具体的代码如下:

void num(char *p); //声明拨号自定义函数原型
void wait(); //声明等待通话的自定义函数原型
void tonghua(); //声明通话的自定义函数原型
void dianhua(); //声明打电话的定义函数原型
#include<stdio.h> //包含头文件
main() //主函数开始
{
    printf("模拟打电话的步骤说明函数的嵌套调用\n"); //输出提示语
    dianhua(); //调用自定义函数实现打电话
    return 0;
}
void dianhua() //实现自定义函数
{
    char *number="13527387"; //定义并初始化字符指针
    num(number); //调用拨号自定义函数
    wait(); //调用等待函数
    tonghua(); //调用通话函数
}
void num(char *p) //实现拨号函数功能
{
    printf("正在拨号……\n");
    printf("所拨号码为:%s\n",p);
}
void wait() //实现等待函数功能
{
    printf("正在等待电话接通\n");
    }
void tonghua() //实现通话函数功能
{
    printf("正在通话……\n");
}

图6.6 程序运行结果

在上面的程序中,用户分别自定义了三个函数实现拨号、等待以及通话功能。在实现过程中,使用自定义函数“dianhua()”实现这三个步骤的联系,并输出相应的提示信息,如图6.6所示。

注意 如图6.6所示,用户使用函数的嵌套方法实现了打电话步骤的顺序。如果用户需要完善这个实例程序,可以再添加一个函数实现挂断电话的功能。关于该函数的具体实现,用户可以参考本节知识进行程序编写。