如何防止这个无限循环

时间:2020-02-18 01:07:20

标签: c loops for-loop infinite-loop unsigned-char

当我运行以下代码时,如果最高数值等于255,有时它将成功退出,有时将进入无限循环。我理解这是由于当255递增并变为0时发生翻转而发生的。我理解为什么会这样正在发生,但我想就此停止操作提出建议。我是否应该在末尾放置if语句以检查i是否等于最大数,然后在末尾中断?这似乎是不好的风格,如果我增加变量的大小,很容易忘记修复它。

    // delete all the files
    for (unsigned char i = 0; i <= highestNum; i++){
        rc = snprintf(formatString, sizeof(formatString), "x%u", i);
        if (rc < 0){
            perror("snprintf in delete");
        }
        rc = unlinkat(directoryFD, formatString, 0);
        if (rc == 0){
            printf("file unlinked\n");
        }
    }

3 个答案:

答案 0 :(得分:1)

使用unsigned int类型代替unsigned char类型:) 否则,当i等于该类型的最大值255(UCHAR_MAX is equal to 255)时,则i递增之后的下一个值将再次为0,并且将得到无限循环。

因此,变量maximumNum等于或大于UCHAR_MAX的任何值都会导致无限循环。

答案 1 :(得分:1)

您可以使用更广泛的类型(例如const arrayOne = [ { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer" }, { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed" }, { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi" }, { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal" }, { value: "a63a6f77-c637-454e-abf2-dfb9b543af6c", display: "Ryan" }, ]; const arrayTwo = [ { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer"}, { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed"}, { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi"}, { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal"}, ]; // The same solution const results = arrayOne.filter( item1 => !arrayTwo.some( item2 => item1.value === item2.value) ); console.log(results);)来完成此操作,并且代码更改最少。另一种选择是使用不同循环变量,例如unsigned int

do..while

这与int highestNum = 255; { unsigned char i = 0; do { printf("%u\n", i); ++i; } while (i <= highestNum && i != 0); } 循环的作用域类似,因为for不会“转义”它声明的块,并且对i进行零校验会发现环绕情况(在i循环中有些困难,因为它在每次迭代的开始而不是结束时检查条件)。

请注意,没有检查以确保for为零或更大,因此至少一个文件将始终被删除。如果您希望不指定任何文件的功能(例如,如果要删除 no 文件,则可以将highestNumber设置为highestNumber),则可以添加简单的预检查:

-1

答案 2 :(得分:0)

避免这种情况的一种方法是将i声明为int,然后在使用它的循环中将其强制转换为char

for (unsigned int i = 0; i <= highestNum; i++){
    rc = snprintf(formatString, sizeof(formatString), "x%u", (unsigned char) i);
    if (rc < 0){
        perror("snprintf in delete");
    }
    rc = unlinkat(directoryFD, formatString, 0);
    if (rc == 0){
        printf("file unlinked\n");
    }
}