c - For 循环遍历数组导致无限循环

标签 c arrays for-loop character bcc-compiler

我有一段代码,应该在按下回车键时刷新字符数组,只有代码无限循环,我不明白为什么。

有一个字符数组,每次按下键时都会获取一个新字符。当检测到 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/

相关文章:

c - C 中的特殊测试位函数

c - 在C中,将指向字符串的指针从函数传递到主函数的正确方法是什么

java - 如何将 JSON 数组转换为 Java 字符串数组

Python:我的 for 循环不会迭代列表中的所有项目

c - sendmsg/recvmsg 中的部分读/写问题

c - C语言中如何判断一个字符串是否以另一个字符串结尾

python - Numpy 删除重复的列值

javascript - 如果另一个数组具有相同的元素,则连接数组元素

c++ - 计算c++密码程序的循环

Python - 更快的循环方式