字符串比较循环问题

时间:2014-07-07 18:26:56

标签: c string loops comparison

我正在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没有捕获条件。即使我输入剑或狼牙棒,它仍然会继续循环。我相信这将是一件我看不到的简单事情,但任何帮助都会受到赞赏。

4 个答案:

答案 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)

如果您想在成功获得swordmace之后突破循环,那么除了将cobra_weapon长度增加1的其他注释之外,您只需使用{{ 1}}:

break