为什么 getch() 在第一个 运行 (行)输出 10 个字符,而在所有后续行输出 9 个字符?

Why does getch() output 10 characters on first run (line) but 9 characters for all following lines?

我有这个程序,每 10 个字符后创建一个新行。但是,一旦它达到第二次迭代,之后它只输出 9 个字符。如果我将第二个 i 设置为 -1,该程序可以工作,但我不明白为什么它不能将 i 设置为 0。逻辑与第一个 运行 完全相同,因为第一个 i 只是 运行 一次,所以当我想要换行时,我会重置 i.有人可以解释我所缺少的吗?我在纸上画出了步骤,但还是看不懂。谢谢。

#include <stdio.h>
#include <ncurses.h>            

#define MAXLINE 10


// count number of chars, once it reaches certain amount
int main (void) 
{
    //cbreak();
    // to open curses terminal
    initscr();

    int i, c;

    // first iteration set to 1
    for (i = 0; (c = getch()) != EOF; i++)
    {
         if (i == (MAXLINE-1))
         {
             printf("\r\n");
             i = 0;          // Counter is reset. To break out of the loop use CTRL + D.
         }
    }

    // to close curses terminal
    endwin();
}

第一次通过循环i是零。当你在循环内将i设置为零时,当控制到达for的末尾时,执行的语句是i++(使i为1),然后(c = getch()) != EOF

第一次迭代从 i 设置为零开始。当循环中的测试将i重置为零时,for循环中i++的正常执行仍然发生,因此下一次迭代将i设置为1,而不是零。

您似乎将我 的两个示例与您之前的问题混为一谈。

不幸的是,尽管我暗示了不同之处,但我似乎没有明确指出重置。抱歉。

重置需要比计数器的初始起始值小 1,因为计数器在重置发生的循环结束时递增,尽管递增应该只对每次完整的下一次迭代有效.我们需要将其减去一个整数值来补偿这种影响。

在您的实际代码中,您需要将 i = 0; 替换为 i = -1,如我之前回答中的示例之一所示。


此外,cbreak() 的注释不是一个好主意,因为当程序启动时控制台可以处于 cbreak()nocbreak() 模式(它不是固定的).使用显式 cbreak() 确定输入将立即按字符读取,而无需等待换行符刷新缓冲区。

Linux man page 说:

"Initially the terminal may or may not be in cbreak mode, as the mode is inherited; therefore, a program should call cbreak or nocbreak explicitly."