C 字符串比较循环问题

C 字符串比较循环问题,c,string,loops,comparison,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_we

为了好玩,我正在用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没有捕捉到条件。即使我输入剑或狼牙棒,它仍然会继续循环。我相信这将是一些简单的,我没有看到,但任何帮助将不胜感激

char cobra_weapon[5];
...
fgets(cobra_weapon, 5, stdin);
您需要6个字符才能使用剑记住跟踪“\0”

改为:

char cobra_weapon[6];
使用fgets时,也要删除尾部\n:


首先,要考虑以下几点:

char cobra_weapon[5];
内存不足,无法存储\0。将其更改为:

char cobra_weapon[6];  
…或者更好,将其更改为更大的维度:

char cobra_Weapon[63+1]; 
然后,还要改变:

fgets(cobra_weapon, 5, 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(0 == strcmp(cobra_weapon,"sword") || 0 == strcmp(cobra_weapon,"mace"));
或:

只要没有剑和狼牙棒,就保持循环:

while(strcmp(cobra_weapon,"sword") && strcmp(cobra_weapon,"mace"));
只要有剑和狼牙棒,就可以继续循环:

while(0 == strcmp(cobra_weapon,"sword") && 0 == strcmp(cobra_weapon,"mace"));
只要有剑或狼牙棒,就保持循环:

while (strcmp(cobra_weapon,"sword") != 0 || strcmp(cobra_weapon,"mace") != 0);
while(0 == strcmp(cobra_weapon,"sword") || 0 == strcmp(cobra_weapon,"mace"));
您正在使用FGET获取输入,按enter键时会保留换行符

因此,对于4个字母的单词,如mace,您需要保留至少6个空格:

mace + \n + \0
  4  +  1 +  1 == 6.

这也是你的strcmp失败的原因。尝试将mace与mace进行比较\n不会导致匹配。它们不是同一根弦

如果您的目的是在成功获得剑或狼牙棒后打破循环,那么除了其他关于将眼镜蛇武器长度增加1的评论外,您可以简单地使用break:


fgets也可以接受换行符,因此,sword实际上是sword\n\0如果在if中添加中断,则不需要while循环中的检查和if语句。我认为您可以使用调试程序只需使用strncmp而不是strcmp,并且只比较您尝试匹配的字符串的长度。当用户按enter键时,fgets肯定会保留该字符串。所以您需要7个字符:sword+\n+\0。@abelenky,fgets函数将从流中读取字节到s指向的数组中,直到读取n-1字节,或者读取a并将其传输到sYup:也就是说:如果读取并传输新行,则结果缓冲区中有一个新行。@abelenky,否,如果sizeofcobra_武器==6,并且您键入剑,则换行符不会被转移。如果你输入梅斯怎么办?4个字符。。。然后眼镜蛇武器将是狼牙棒\n\0 6个字符,无法成功与狼牙棒\0进行比较。不,狼牙棒只需要5个字符,剑只需要6个字符,因为fgetsstops在n-1上,当然你需要字符[6]和skip\n来存储并比较两个字符串,请参阅我的答案
mace + \n + \0
  4  +  1 +  1 == 6.
char cobra_weapon[6];
...

do {
    fgets(cobra_weapon, sizeof (cobra_weapon), stdin);

    if (strcmp(cobra_weapon,"sword") == 0) {
        cobra_main_hand = sword + cobra_sword_bonus;
        break;
    }
    else if (strcmp(cobra_weapon,"mace") == 0) {
        cobra_main_hand = mace + cobra_mace_bonus;
        break;
    }
    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);