首页 > 解决方案 > for循环不终止

问题描述

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

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

有人有想法吗?

标签: 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++)

使用一些占位符标识符,循环条件以 形式编写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++)
//                                     ^                                                                                 ^

推荐阅读