【问题标题】:Is there a way to print a string-type variable in C++ via the ncurses library?有没有办法通过 ncurses 库在 C++ 中打印字符串类型的变量?
【发布时间】:2021-05-13 17:57:22
【问题描述】:

我一直在尝试通过 ncurses 的函数打印出一个字符串类型变量,因为在我输入“initscr()”命令时“cout”无法正常工作。我创建了一个字符串变量数组,我试图在窗口上打印每一个字符串。我得到的结果是一些废话。这是我的代码中最关键的部分:

string *filetypes = new string[4];
filetypes[0] = ".png";
filetypes[1] = ".jpeg";
filetypes[2] = ".jpg";
filetypes[3] = ".gif";
initscr();
WINDOW *menu = newwin(height, width, y, x);
box(menu, 0, 0);
keypad(menu, true);
selection = menuShow(filetypes, 4, menu);
endwin();

我正在通过“menuShow”函数打印数组的值。这里也是函数的代码:

int menuShow(string *choices, int opt, WINDOW *menu)
{

int i, highlight = 0;
system("clear");
noecho();
wchar_t buttonPress;
do
{
    refresh();
    wrefresh(menu);
    for(i = 0; i < opt; i++)
    {
        //xrwmatizei thn epilegmenh praksh sthn opoia vrisketai o cursor
        if(i == highlight)
        {
            wattron(menu, A_REVERSE);
            mvwprintw(menu, i + 1, 1, "%s", choices[i]);
            wattroff(menu, A_REVERSE);
        }
        else
        {
            mvwprintw(menu, i + 1, 1, "%s", choices[i]);
        }
            
    }
    wrefresh(menu);
    refresh();
    buttonPress = wgetch(menu);
    switch(buttonPress)
    {
        case KEY_UP:
            highlight--;
            if(highlight == -1)
                highlight++;
           break;
        case KEY_DOWN:
            highlight++;
            if(highlight > (opt - 1))
                highlight--;
            break;
        default:
            break;
    }        

}while(buttonPress != 10);

return highlight;

我得到的输出是:

~P/~[#�^? 
~P/~[#�^? 
~P/~[#�^? 
~P/~[#�^? 

有什么想法吗?

顺便提一下,在“endwin();”之后行,我正在使用 cout 打印出数组的字符串,并且它们正在正常打印。我认为发生这种情况的原因是“printw()”和 ncurses 的函数通常不支持“字符串”格式。所以,我的问题是:是否有任何方法可以在“initscr();”之后打印出字符串类型变量?行吗?

【问题讨论】:

  • 请不要这样做system("clear")。除了不必要——erase(); refresh() 就足够了——它会以诅咒无法识别的方式改变屏幕。

标签: c++ arrays string output ncurses


【解决方案1】:

menuShow 使用与printf() 相同的类型格式化程序。

所以"%s" 期待一个 C 字符串(或 char*)。

您提供的std::string 不一样。

int menuShow(string *choices, int opt, WINDOW *menu)

    ... STUFF

    mvwprintw(menu, i + 1, 1, "%s", choices[i]);
                                    ^^^^^^^^^^ this is a std::string

您要做的是将std::string 转换为char*,您可以通过调用c_str() 来完成此操作。

    mvwprintw(menu, i + 1, 1, "%s", choices[i].c_str());
                                           // ^^^^^^^^

您正在使用ncurses 一个(非常酷但)C 库。这里的问题是 C 语言不像 C++ 那样安全。在这种情况下,C 语言为mvwprintw() 提供了可变数量的参数,不幸的是,这些参数的类型没有指定,因此编译器不会检查您是否传递了有效类型(因此没有警告或错误)。

注意:C++ 仍然提供这种旧式接口以向后兼容 C,但在更现代的 C++ 库中,您将使用模板可变参数,以便我们可以显式确保类型正确。

【讨论】:

    【解决方案2】:

    格式“%s”需要 char*,而不是 std::string。试试

    mvwprintw(menu, i + 1, 1, "%s", choices[i].c_str());
    

    你为什么这样做

    string *filetypes = new string[4];
    filetypes[0] = ".png";
    filetypes[1] = ".jpeg";
    filetypes[2] = ".jpg";
    filetypes[3] = ".gif";
    

    为什么不

    string filetypes[4] = {
      ".png",
      ".jpeg",
      ".jpg",
      ".gif",
    };
    

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 2019-03-29
      • 2019-11-14
      • 1970-01-01
      • 2016-05-31
      • 2012-05-23
      • 2021-04-19
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多