为什么 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()
确定输入将立即按字符读取,而无需等待换行符刷新缓冲区。
"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."
我有这个程序,每 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()
确定输入将立即按字符读取,而无需等待换行符刷新缓冲区。
"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."