for 循环不会终止

时间:2021-04-19 21:05:56

标签: c

我想弄清楚为什么我最里面的 for 循环没有中断。
我已经为 char 数组的“列表”实现了一个 Caesar 密码

void caesar(char **list, size_t listsize, unsigned int offset) {
    for (size_t i = 0; i < listsize; i++) {
        for (size_t j = 0; list[i] != NULL && j < sizeof(list[i]); j++) {
            for (unsigned int k = 0; k < offset && (list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122); k++) {
                if(list[i][j] == 122)
                    list[i][j] = 97;
                else if(list[i][j] == 90)
                    list[i][j] = 65;
                else
                    list[i][j]++;

                //works with the break condition
/*                if(k == offset - 1)
                    break;*/
            }
        }
    }
}

所以如果没有最后一个 break 语句,我会得到一个无限循环,即使我的 break 循环的头部有一个 for 条件。

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

<块引用>
for (unsigned int k = 0; k < offset && (list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122); k++)

使用一些占位符标识符,循环条件以 a && b || c 的形式编写,由于运算符优先级,它被解析为 (a && b) || c 而不是您想要的 a && (b || c)。您可以添加一些括号来修复它:

for (unsigned int k = 0; k < offset && ((list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122)); k++)
//                                     ^                                                                                 ^