遍历数组导致无限循环

时间:2020-02-09 18:48:08

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

每次按下一个字符时,i在主循环中都会递增(输入(ASCII 13)除外)。该字符也被添加到buffer []。该代码未在此处显示,尽管我可以重现。不用说,即使代码不正确地增加了i,循环也应该在我达到0时结束(并且我应该在递减的某个时候达到0)。

所以从理论上讲,按下Enter键后,如果该行上有5个字符(并且没有退格键),则buffer []元素0-4将具有这些字符,而i将等于5。代码应将5到0的元素替换为'\ 0'字符。从元素5开始当然是不必要的,但是它不会引起我一直在经历的行为。

该行为是循环不断地运行。现在,我已经能够通过使用putchar函数在每次循环运行时打印一个字符来验证这一点。现在,我想我可以编写另一个函数以使我也可以打印i的值,并且我很可能会得到我问题的答案。另外,就其价值而言,当我将此循环转换为等效的“ while”循环时,就会发生无限循环。

我只是想确保没有明显的东西在这里引起无限循环行为。抱歉,这是一个愚蠢的问题。谢谢你的帮助。该程序以16位实模式运行为原始二进制文件。我正在从bcc到as86到最终的二进制文件进行编译。

编辑:经过更多调试后,我确认我将以正确的正值进入循环(基于数组中的字符数,例如,如果7个字符,则i = 7)。但是,在for循环中,i无限地在-1和-2之间切换。由于基于i的输入值(或基于循环的条件)没有意义,因此这是否有某种内存或寄存器问题?

最终编辑:问题似乎出在> =条件下,导致我转为负面。由于某种原因,即使for循环中的条件检查负i,这也会导致无限循环。感谢您的所有帮助。

1 个答案:

答案 0 :(得分:2)

由于某种原因,即使for循环中的条件检查负i,这也会导致无限循环。

“ for循环检查中的条件”为true,但未在所有需要的位置进行检查。


至少一个问题:尝试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;用于数组索引。