将光标移动到 ncurses 窗口中一行文本的末尾?

时间:2021-05-19 05:42:16

标签: c ncurses curses

我有几个 ncurses 窗口,正在尝试将光标移动到当前文本行的末尾。

换句话说,我想移动到窗口末尾的第一个非空白字符。

示例:

如果我在 ncurses 窗口中有一行文本

I need help! Please! !
   ^
   |
 cursor

我想把光标移到最后一个字符

I need help! Please! !
                     ^
                     |
                   cursor

我最好的尝试是这样的:

#include <ncurses.h>

int main()
{
    initscr();
    refresh();

    WINDOW* w = newwin(100, 100, 0, 0);
    wprintw(w, "I need help! Please! !");
    wmove(w, 0, 3);
    wrefresh(w);

    // MY ATTEMPT
    int maxX, maxY, x, y;
    getmaxyx(w, maxY, maxX);
    getyx(w, y, x);

    wmove(w, y, maxX);
    while (winch(w) == ' ') {
        wmove(w, y, maxX-1);
    }
    wrefresh(w);
    // END OF MY ATTEMPT

    getch();
    delwin(w);
    endwin();
    return 0;
}

我认为这在逻辑上是合理的,但不起作用,我不知道为什么(光标的位置根本没有改变)

我该怎么做?有没有我失踪的简单方法?为什么我的解决方案不起作用?

1 个答案:

答案 0 :(得分:2)

您永远不会更新循环内的 x 位置,因此您会反复移动到窗口右边缘之前的位置。

假设您不在其他地方使用 maxX,只需在循环内预先递减它。

while((winch(w) & A_CHARTEXT) == ' ') {
   wmove(w, y, --maxX);
}

请注意,您还应该使用 A_CHARTEXT 位掩码从 char 中提取 chtype


使用 stdscr 的一个非常粗略的方法工作示例:

#include <ncurses.h>

int main(void) {
    initscr();
    noecho();
    cbreak();

    while (1) {
        clear();
        mvprintw(10, 5, "Hello world");
        move(0, 0);

        int my,mx;
        getmaxyx(stdscr, my, mx);

        move(10, mx);

        while ((inch() & A_CHARTEXT) == ' ')
            move(10, --mx);

        refresh();
        napms(100);
    }

    endwin();
}