在C++/NCurses的printw系列函数中重复n次符号是否有更优方案?
在NCurses中优雅重复打印符号的优化方案
你当前通过构造std::string(n, '.')再用mvwprintw输出的方案完全可行,这里提供几种更简洁或高效的优化方式:
方案1:利用printf格式符直接生成重复字符
无需构造字符串,借助标准printf的格式化能力实现,避免临时对象开销:
#include <ncurses.h> #include <iomanip> // 用于setfill int main() { int n = 8; initscr(); cbreak(); noecho(); WINDOW *bottombar = newwin(3, 118, 22, 1); refresh(); // 保存原填充字符,避免影响后续输出 char old_fill = std::setfill('.'); // %*s 表示用n作为字段宽度,空字符串会被填充n个'.' mvwprintw(bottombar, 1, 1, "%*s", n, ""); // 恢复原填充字符 std::setfill(old_fill); wrefresh(bottombar); getch(); endwin(); return 0; }
优点:无字符串内存分配,性能最优,适合大n或频繁调用场景。
方案2:NCurses原生函数循环添加字符
用mvwaddch直接循环写入字符,纯NCurses操作,不依赖C++字符串:
#include <ncurses.h> int main() { int n = 8; initscr(); cbreak(); noecho(); WINDOW *bottombar = newwin(3, 118, 22, 1); refresh(); // 逐个写入n个'.',注意光标位置偏移 for(int i = 0; i < n; ++i) { mvwaddch(bottombar, 1, 1 + i, '.'); } wrefresh(bottombar); getch(); endwin(); return 0; }
优点:无需引入C++标准库字符串,适合纯C风格的NCurses代码。
方案3:简化原方案,使用临时字符串
保留原思路,但省去单独变量声明,代码更紧凑:
#include <ncurses.h> #include <string> int main() { int n = 8; initscr(); cbreak(); noecho(); WINDOW *bottombar = newwin(3, 118, 22, 1); refresh(); // 直接构造临时字符串传入,无需单独变量 mvwprintw(bottombar, 1, 1, "%s", std::string(n, '.').c_str()); wrefresh(bottombar); getch(); endwin(); return 0; }
优点:代码最简洁,可读性强,小n场景下性能可忽略。
内容的提问来源于stack exchange,提问作者Ikarosa
相关产品推荐
相关产品推荐

