当我运行以下代码时,如果最高数值等于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");
}
}
答案 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");
}
}