强制printf忽略格式

时间:2016-10-09 23:14:15

标签: c printf curses

我正在使用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只是一个美化的版本,只是单独粘贴每个角色?这些真的是我唯一的两个选择吗?

3 个答案:

答案 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);