为什么do-while循环永远不会结束?

时间:2017-07-11 17:07:31

标签: c

我正在制作基于文字的游戏。我输入的一件事是一类需要成为特定角色的玩家。我为他们输入的每个现有玩家(即pnum变量)执行此操作。

typedef struct players {
  char class, upgrade1, upgrade2, upgrade3;
  int secondwarD, secondwarS;
  int funds; 
} players;

struct players p[pnum];

for(i=0;i<pnum;i++) {
    do {
      printf("Player %d insert your class:\n", i+1);
      p[i].class=getc(stdin);
    } while(p[i].class!='c' || p[i].class!='t' || p[i].class!='a' || p[i].class!='d');
}

不幸的是,尽管我插入了一个可能的角色,它仍然停留在同一个玩家的do + while循环中。这是一件简单的事情,但我无法找到与之匹配的现有问题。任何帮助表示赞赏:)

1 个答案:

答案 0 :(得分:2)

用&amp;&amp;(ANDs)

替换||(OR)
for(i=0;i<pnum;i++) {
    do {
      printf("Player %d insert your class:\n", i+1);
      p[i].class=getc(stdin);
    } while(p[i].class!='c' && p[i].class!='t' && p[i].class!='a' && p[i].class!='d');
}

想象一下,用户输入char t。如果它是OR而不是AND,则第一个条件将为真,这足以再次继续循环。但是如果它和所有条件都需要为TRUE才能继续循环。由于第二个将为FALSE,因此do-while循环将终止。

简而言之,

(p[i].class!='c' || p[i].class!='t' || p[i].class!='a' || p[i].class!='d')

意味着 ANY TRUE 足以 PROCEED 与循环

但是,

(p[i].class!='c' && p[i].class!='t' && p[i].class!='a' && p[i].class!='d')

意味着 ANY FALSE 足以停止循环