我正在C中制作一个小小的文字冒险游戏以获得乐趣,我遇到了一个小问题。
char cobra_weapon[5];
int cobra_sword_bonus = 3;
int cobra_mace_bonus = -2;
int cobra_attack_score;
int cobra_main_hand;
int cobra_off_hand = shield;
do {
fgets(cobra_weapon, 5, stdin);
if (strcmp(cobra_weapon,"sword") == 0)
cobra_main_hand = sword + cobra_sword_bonus;
else if (strcmp(cobra_weapon,"mace") == 0)
cobra_main_hand = mace + cobra_mace_bonus;
else
printf ("You entered %s. Please enter either sword or mace.\n", cobra_weapon);
} while (strcmp(cobra_weapon,"sword") != 0 || strcmp(cobra_weapon,"mace") != 0);
我遇到的问题是当我输入正确的字符串时strcmp没有捕获条件。即使我输入剑或狼牙棒,它仍然会继续循环。我相信这将是一件我看不到的简单事情,但任何帮助都会受到赞赏。
答案 0 :(得分:0)
char cobra_weapon[5];
...
fgets(cobra_weapon, 5, stdin);
你需要6个字符“剑”(记住trailling '\0'
)
更改为:
char cobra_weapon[6];
在使用\n
fgets
char cobra_weapon[6];
char *p;
...
fgets(cobra_weapon, sizeof(cobra_weapon), stdin);
if ((p = strchr(cobra_weapon, '\n')) != NULL) {
*p = '\0'; /* remove newline */
}
...
答案 1 :(得分:0)
首先,需要考虑的一些事项:
char cobra_weapon[5];
这是没有足够的内存存储"剑\ 0"。将其更改为:
char cobra_weapon[6];
...甚至更好,将其更改为更大的维度:
char cobra_Weapon[63+1];
然后,也改变:
fgets(cobra_weapon, 5, stdin);
为:
fgets(cobra_weapon, sizeof(cobra_weapon), stdin);
最后,请记住fgets()喜欢附加' \ n'输入字符串的字符。因此,删除换行符很重要。也许这样的事情会更好:
do {
char *cp;
while(NULL == fgets(cobra_weapon, sizeof(cobra_weapon), stdin))
/* LOOP */ ;
cp=strchr(cobra_weapon, '\n');
if(cp)
*cp='\0';
...
只要有剑,就保持循环, - 或 - 一个狼牙棒:
while (strcmp(cobra_weapon,"sword") != 0 || strcmp(cobra_weapon,"mace") != 0);
或:
while(strcmp(cobra_weapon,"sword") || strcmp(cobra_weapon,"mace"));
只要有-no- sword -and- -no- mace:
,就可以保持循环while(strcmp(cobra_weapon,"sword") && strcmp(cobra_weapon,"mace"));
只要有一把剑和一个狼牙棒,就保持循环:
while(0 == strcmp(cobra_weapon,"sword") && 0 == strcmp(cobra_weapon,"mace"));
只要有一把剑 - 或者一个狼牙棒,就保持循环:
while(0 == strcmp(cobra_weapon,"sword") || 0 == strcmp(cobra_weapon,"mace"));
答案 2 :(得分:0)
您正在使用fgets
获取输入,当您按Enter键时会保留换行符(\n
)。
因此,对于一个4个字母的单词,如“mace”,您需要保留至少6个空格:
mace + \n + \0
4 + 1 + 1 == 6.
这也是你strcmp
失败的原因。试图将“mace”与“mace \ n”进行比较不会导致匹配。它们不是同一个字符串!
答案 3 :(得分:0)
如果您想在成功获得sword
或mace
之后突破循环,那么除了将cobra_weapon长度增加1的其他注释之外,您只需使用{{ 1}}:
break