我正在尝试编写一个程序,充当使用curses.h库创建侧滚动显示的选取框.
应该发生的是,我的消息“ Hello”应该从终端的右侧逐个字符滚动到左侧.
“ 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
}
}
解决方法:
第一个问题是您在initscr()之前调用getmaxyx().在这种情况下,stdscr尚未初始化,因此getmaxyx()返回的值没有意义. (对于每个值,我得到-1,又称ERR.)
该问题已解决,该程序基本上可以运行,但是在“ Hello”字符串之后显示垃圾邮件.您可以通过更改for循环测试text_length ||来解决此问题. i< max_x,至text_length&& i< max_x,尽管结果可能仍然不是您想要的.但我会留给您找出答案. 最后,作为样式问题,我建议使用curses自己的napms()函数而不是usleep()(即napms(50)而不是usleep(50000)).但是,如果您坚持使用usleep(),则应添加#include< unistd.h>在顶部.