我试图编写一个程序,作为使用curses.h library
创建侧滚动显示的选框。
应该发生的是我的消息"你好"应该看起来从终端的右侧向左侧滚动,逐个字符。
"你好"应该像这样滚动终端:
| 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
}
}
答案 0 :(得分:4)
第一个问题是您在getmaxyx()
之前致电initscr()
。在这种情况下,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>
。