我正在使用pdcurses库,我正在编写一个在屏幕上移动一行的功能。这涉及复制当前行,然后将其粘贴到上面。问题是用于打印整行的curses函数printw
使用与printf
相同的格式字符串。这些线条可能包含百分号,因此一旦粘贴,这些标志当然就会丢失。
printw()函数将格式化的字符串添加到窗口中 当前或指定的光标位置。格式字符串是 与标准C库的printf()中使用的相同。 (printw() 可以用作printf()的替代品。)
一个小例子是:
chtype p[200];
winchnstr(w, p, 200); //obtain the line
clrtoeol(); //remove the line
wmove(w, y-1, x); //move up a line
clrtoeol(); //erase the line
wprintw(w, p); //print the new line
有没有办法强制printf将百分号符号视为正常,而不必通过p
并在每个符号之间插入一个百分号?对于这么简单的事情来说,这似乎很烦人。
第一个解决方案是将p
转换为字符串,遍历字符串,并在%
后面插入%
。但是当我一次移动大量的线条时(我试图创建一个“向上移动”的屏幕效果),这可能不是性能方面的最佳解决方案,是吗?
另一种解决方案是反复遍历p
,只需使用addch()
分别添加每个字符。但与wprintw
相比,这会失去性能/效率吗?或者wprintw
只是一个美化的版本,只是单独粘贴每个角色?这些真的是我唯一的两个选择吗?
答案 0 :(得分:2)
要强制printf
按原样接受字符串,请使用格式说明符%s
并将字符串作为参数传递。 printf
参数不适用于格式处理。对于字符串,只需将字节复制到目标缓冲区。
printf("%s", "My string with % signs");
如果你的字符串没有被终止,你可以在字符串之前传递一个长度到printf,如果你使用%*s
格式说明符:
printf("%*s", 5, "ab%cdefghi"); // prints "ab%cd"
请注意,length参数必须是int
类型。
答案 1 :(得分:2)
您可以使用addstr()
代替printw()
。 (printw()
基本上只解析格式字符串并将结果传递给addstr()
。)
答案 2 :(得分:1)
你不能简单地改变:
wprintw(w, p);
代替:
wprintw(w, "%s", p);
或者:
waddchstr(w, p);