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

Moving the cursor to the end of a line of text in ncurses window?

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

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

示例:

如果我在ncurses中有一行文字window

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;
}

我认为这在逻辑上是合理的,但行不通,我不确定为什么(光标的位置根本没有改变)

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

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

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

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

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


你的方法的一个非常粗略的例子,使用 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();
}