我的代码应该制作一个简单的菜单来改变角色的护甲。代码是:
#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;
}
当我尝试在菜单上使用任何内容时,程序总是退出,而不是运行调用的函数。在代码中我有什么问题吗?
编辑:这是括号。感谢。答案 0 :(得分:2)
我猜你忘记了()意味着changeArmor()和checkArmor()是函数。
所以,当你做出选择时,它没有做任何事情,并且一直持续到它返回0。
答案 1 :(得分:1)
正如Jonathan Leffler和T. Roncoli已经回答的那样,你并没有真正进行函数调用。例如,菜单不是函数调用,它只是指向函数的指针。相反,您需要执行menu()才能调用该函数。
PS:
我还想在这里注意,它可能不值得拥有递归菜单功能,因为它只会增加你的堆栈内存段。在现实系统中,堆栈实际上有限制它可以增长多少。您可以改为使用迭代解决方案并循环直到退出命令(a == 3)。
人们可能会争辩说C没有堆栈的概念,但x86和x64机器上的所有编译器都会使用堆栈进行自动变量和函数调用。
通过不断提供会触发menu()函数的值来测试程序崩溃前堆栈的增长量是一件好事。