我有一段代码应该在按下回车键时刷新一个字符数组,只有代码无限循环,我不知道为什么。
有一个字符数组,每次按下一个键都会获取一个新字符。检测到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,这也会导致无限循环。感谢您的所有帮助。
答案 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;
用于数组索引。