不正确处理功能

时间:2016-04-25 03:23:19

标签: c

我的代码应该制作一个简单的菜单来改变角色的护甲。代码是:

#include <stdio.h>
#include <string.h>

struct Armor {
   char chestplate [50];
   char helmet [50];
};

void changeArmor (){
    struct Armor character;
    char a [50];
    printf("Choose a chestplate\n");
    scanf("%s",&a);
    strcpy(character.chestplate,a);
    printf("Choose a helmet\n");
    scanf("%s",&a);
    strcpy(character.helmet,a);
    menu();
}

void checkArmor () {
    struct Armor character;
    printf("Your equipped chestplate is: %s\n", character.chestplate);
    printf("Your equipped helmet is: %s\n", character.helmet);
    menu();
}

void menu () {
    int a;
    printf("What do you want to do?\n");
    printf("1.Change Armor.\n");
    printf("2.Check current armor.\n");
    printf("3.Quit\n");
    scanf("%d",&a);
    if(a==1) changeArmor;   // Oops: should be changeArmor();
    if(a==2) checkArmor;    // Oops: should be checkArmor();
    if(a!=3) menu;          // Oops: maybe this should be menu(); — or …
}

void initializeChar (){
    struct Armor character;
    strcpy(character.chestplate, "Shirt");
    strcpy(character.helmet, "Hat");
}

int main () {
    struct Armor character;
    initializeChar();
    menu();
    return 0;
}

当我尝试在菜单上使用任何内容时,程序总是退出,而不是运行调用的函数。在代码中我有什么问题吗?

编辑:这是括号。感谢。

2 个答案:

答案 0 :(得分:2)

我猜你忘记了()意味着changeArmor()和checkArmor()是函数。

所以,当你做出选择时,它没有做任何事情,并且一直持续到它返回0。

答案 1 :(得分:1)

正如Jonathan Leffler和T. Roncoli已经回答的那样,你并没有真正进行函数调用。例如,菜单不是函数调用,它只是指向函数的指针。相反,您需要执行menu()才能调用该函数。

PS:

我还想在这里注意,它可能不值得拥有递归菜单功能,因为它只会增加你的堆栈内存段。在现实系统中,堆栈实际上有限制它可以增长多少。您可以改为使用迭代解决方案并循环直到退出命令(a == 3)。

人们可能会争辩说C没有堆栈的概念,但x86和x64机器上的所有编译器都会使用堆栈进行自动变量和函数调用。

通过不断提供会触发menu()函数的值来测试程序崩溃前堆栈的增长量是一件好事。