【发布时间】:2015-03-30 09:34:37
【问题描述】:
代码:
#include <ncurses.h>
int main(int argc, char **argv)
{
initscr();
noecho();
cbreak();
mvprintw(0, 0, curses_version());
mvprintw(1, 0, "Hello World");
mvaddch(2, 0, mvinch(1, 4)); // Why doesn't this work?
getch();
endwin();
return 0;
}
输出:
ncurses 5.9.20130608
Hello World
在o 的Hello 之后,指针闪烁(等待getch)。
问题:
与在 C 中一样,传递给函数的参数在调用该函数之前首先被评估,mvinch() 将首先被调用,当它返回字符 o 时,将调用mvaddch()。
但是为什么字符 o 没有打印在第 2 行(就在 Hello World 下方)?而mvaddch 在当前光标位置打印o(感谢winch 是1,4)。这里mvaddch() 的行为就像addch 一样,不考虑mv 前缀和赋予它的显式移动坐标。为什么?
这可能是 mvaddch() 中的错误还是我遗漏了什么?
编辑:$ uname -aLinux Titanic 3.11.0-26-generic #45-Ubuntu SMP Tue Jul 15 04:02:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
【问题讨论】:
-
你在哪个平台上?我在“Hello”中的“H”下方得到了“o”。附带说明一下,使用
mvprintw()打印字符串时要小心。如果字符串恰好包含格式说明符(例如,%s),您就有麻烦了。将mvaddstr()用于固定字符串会更安全。 -
@Ulfalizer - 因为字符串不是像
mvprintw(x, y, str)中的用户生成的,而是硬编码的,所以我认为这个mvprintw表单不用担心。至于系统细节,我已经更新了问题。请看一看。 -
是的,这里不太可能中断。只是值得注意的事情。你用的是什么终端?
-
@Ulfalizer - 当然可以!我正在使用 xterm
-
顺便说一句,当您不包含标头时它起作用的原因可能是 ncurses 也导出了这些函数的“真实”版本,而是被使用了。
标签: c ncurses cursor-position