我有一段代码,应该在按下回车键时刷新字符数组,只有代码无限循环,我不明白为什么。
有一个字符数组,每次按下键时都会获取一个新字符。当检测到 Enter 键时,将执行以下代码,以在屏幕上生成新行之前用 '\0' 字符刷新字符数组:
int main()
{
char i;
char c;
char buffer[80];
i = 0;
c = 0;
while (c = bgetchar())
{
if (c == 13)
{
for (i = i; i >= 0; i--)
{
buffer[i] = '\0';
}
}
else
{
buffer[i] = c;
i++;
}
}
}
每次按下一个字符(除了 Enter (ASCII 13) 之外),i 都会在主循环中递增。该字符也被添加到 buffer[] 中。尽管我可以重现该代码,但此处未显示该代码。不用说,即使该代码不正确地递增 i,循环也应该在 i 达到 0 时结束(并且在给定递减量的情况下,i 应该在某个时刻达到 0)。
所以理论上,按下回车键后,如果该行有 5 个字符(并且没有退格键),buffer[] 元素 0-4 将包含这些字符,并且 i 将等于 5。该代码应将元素 5 到 0 替换为“\0”字符。从元素 5 开始无疑是不必要的,但它不应该导致我所经历的行为。
该行为是循环无限运行。现在,我已经能够通过使用 putchar 函数在每次运行循环时打印一个字符来验证这一点。现在我想我可以编写另一个函数来打印 i 的值,并且我可能会得到我的问题的答案。另外,就其值(value)而言,当我将此循环转换为等效的“while”循环时,就会发生无限循环。
我只是想确保这里没有明显的东西会导致无限循环行为。抱歉,如果这是一个愚蠢的问题。谢谢你的帮助。该程序作为原始二进制文件在 16 位实模式下运行。我正在从 bcc 编译为 as86 到最终的二进制文件。
编辑:进行更多调试后,我确认 i 将以正确的正值进入循环(基于数组中的字符数,例如,如果有 7 个字符,则 i = 7)。然而,在 for 循环中,i 会无限地在 -1 和 -2 值之间交替。由于基于 i 的条目值(或基于循环的条件),这没有任何意义,因此这是否有可能是某种内存或寄存器问题?
最终编辑:问题似乎是 >= 条件导致 i 变为负值。由于某种原因,即使 for 循环中的条件检查 i 是否为负,这也会导致无限循环。感谢您的所有帮助。
最佳答案
For some reason, this caused an infinite loop even though the condition in the for loop checks for a negative i.
“for 循环检查中的条件”为真,但并没有在需要的地方检查该条件。
<小时/>至少有一个问题:尝试 buffer[-1] = c;
这是未定义的行为 (UB) - 可以包含无限循环。
当输入之后(c == 13)
不是 13,代码尝试此 UB。
while (c = bgetchar()) {
if (c == 13) {
for (i = i; i >= 0; i--) {
buffer[i] = '\0';
}
// now i == -1;
} else {
// No protection here that `i` is on the 0..79 range
buffer[i] = c;
i++;
}
}
<小时/>
for (i = i; i >= 0; i--)
作为第一个是值得怀疑的buffer[i] = '\0';
位于其他的 buffer[i] = c; i++;
中未设置的内容上部分。
我怀疑OP需要
// for (i = i; i >= 0; i--) {
for (i = i; i > 0; ) {
// buffer[i] = '\0';
buffer[--i] = '\0';
}
<小时/>
char i;
很不寻常。我期望固定的签名类型,而不是 char
可能已签名或未签名。也许unsigned char i
(上述修复后)或惯用的 size_t i;
用于数组索引。
关于c - For 循环遍历数组导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60140115/