如何在终端上滚动消息?

How do I scroll a message across the terminal?

提问人:user3657834 提问时间:11/27/2014 最后编辑:HDJEMAIuser3657834 更新时间:3/14/2016 访问量:1355

问:

我正在尝试编写一个程序,该程序充当选框,该选框使用 创建侧滚动显示。curses.h library

应该发生的事情是,我的消息“你好”应该出现从终端的右侧滚动到左侧,逐个字符滚动。

“hello”应该看起来像这样滚动整个终端:

|                                              H| // fist frame of animation

|                                             He| //2nd

|                                            Hel| //3rd
                                                  ...
|             Hello                             | // some time in the middle of animation

|Hello                                          | // finished.

我的程序不是在终端上滚动,而是简单地在终端左侧输出“Hello”消息,就好像它已经完成一样。

我认为打印适当数量的空格,然后打印每帧字符串的适当字符数就可以了。

我做错了什么?

以下是我到目前为止的代码:

#include    <curses.h>
#include    <string.h> 
main()
{
    char    message[] = "Hello";
    int     max_y, max_x; // max dimensions of terminal window
    int     text_length;
    int     i,row=0,col=0,spaces=0;

    // Get text length
    text_length = strlen(message);

    // Get terminal dimensions
    getmaxyx(stdscr, max_y, max_x);

    // num of spaces needed to print
    spaces = max_x -1; 

    initscr(); // initialize curses
    clear(); // clear screen to begin

    while(1)
    {
        clear(); // clear last drawn iteration
        move(5,col);
        // print spaces as necessary
        for(i=0;i<spaces;i++)
        {
            addch(' ');
        }
        refresh();
        // print appropriate number of characters of the message            
        for(i=0;i<text_length || i<max_x; i++)
        {
            addch(message[i]);
        }
        refresh();          
        usleep(50000); // wait some time
        spaces = spaces-1; //adjust spaces need for next iteration
    }
}
C Linux 滚动 终端 诅咒

评论

0赞 Jim Garrison 11/27/2014
无限循环开始时的值是多少?max_x

答:

4赞 William McBrine 11/27/2014 #1

第一个问题是你在之前打电话。在此情况下,尚未初始化,因此返回的值是没有意义的。(我为每个值得到 -1,又名 ERR。getmaxyx()initscr()stdscrgetmaxyx()

修复后,程序基本可以工作,但在“Hello”字符串之后打印垃圾。您可以通过将 for 循环测试 、 更改为 来解决此问题,尽管结果可能仍然不是您想要的。但我会留给你去弄清楚。text_length || i<max_xtext_length && i<max_x

最后,作为一个风格问题,我建议使用curses自己的功能来代替(即,而不是)。但是,如果您坚持使用,则应在顶部添加。napms()usleep()napms(50)usleep(50000)usleep()#include <unistd.h>