我已经花了 3 个小时试图让这段代码工作,但是每当我尝试时我都会陷入循环并且控制台不断循环。我已经尝试了所有方法 - 我创建了一个只返回 i 并重新分配值的函数,但它似乎不起作用。
出于某种原因,每当我尝试使用逻辑运算符时,它都不想对我起作用。 mes->hand[x] 的值类似于 "2D,4D,3C,5C,6H,7H"等等,而花色是 "H", "C", "D", "S"in引用卡片。
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
while(x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if(i>= 58){
return y;
}
return i;
}
x++;
continue;
}
if(i >= 57) {
y = determine_letter(i);
}
i ++;
x = 0;
continue;
}
return 0;
}
最佳答案
我有以下观察:
你的
continue
陈述是多余的。您已经处于循环的底部。 (虽然没有伤害。)您的号码
50
etc 都是指 ASCII 字符。添加对此的评论。我能找到的唯一错误是:
if(i >= 57) { y = determine_letter(i); }
这应该是 if (i>=58)
因为 57 ASCII 是 9
.可能 determine_letter
收到 57 时会感到困惑(该函数显然将高于 9 的卡片映射到您的卡片编码方案中,您没有完全提供)。因此,该函数可以在 return y;
中返回无效值。 ,调用函数无法理解并导致您的控制台循环。
另外这条语句应该放在while (x < len)
之前, 所以你首先映射字符然后比较它并在循环结束时递增 i
为下一个字符(卡值)进行比较。
应用这些观察得出:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
if (i >= 58) {
y = determine_letter(i);
}
while (x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if (i >= 58) {
return y;
}
return i;
}
x++;
}
i++;
x = 0;
}
return 0;
}
如果没有调用者、子函数和卡片编码方案的所有细节,我无法提供更多建议。我希望这会有所帮助。
注意:考虑功能,该函数只返回给定花色的第一张牌的值。这意味着比较纸牌值的外循环似乎毫无用处:首先找到第一套花色,然后获取它的值更有效:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0;
while (x < len) {
if (mes->hand[x] == suit)){
return(mes->hand[x-1]);
}
x++;
}
return 0;
}
关于c - 死循环,取不到值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32902951/