Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有方法在C+;中打印字符串类型变量+;通过ncurses图书馆?_C++_Arrays_String_Output_Ncurses - Fatal编程技术网

C++ 是否有方法在C+;中打印字符串类型变量+;通过ncurses图书馆?

C++ 是否有方法在C+;中打印字符串类型变量+;通过ncurses图书馆?,c++,arrays,string,output,ncurses,C++,Arrays,String,Output,Ncurses,我一直在尝试通过ncurses函数打印字符串类型变量,因为在我键入“initscr()”命令时,“cout”不起作用。我已经创建了一个字符串变量数组,并试图在窗口上打印每个字符串。我得到的结果是一些无稽之谈。以下是我的代码中最关键的部分: string *filetypes = new string[4]; filetypes[0] = ".png"; filetypes[1] = ".jpeg"; filetypes[2] = ".jpg&qu

我一直在尝试通过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;
有什么想法吗

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

格式“%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",
};

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

所以
“%s”
需要一个C字符串(或
字符*

您正在提供一个不同的
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()
来完成此操作

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

注意:C++仍然提供了与C兼容的旧风格接口,但是在更现代的C++库中,您将使用模板VARARGS,以便我们可以明确地确定类型是正确的。< /P>请不要做<代码>系统(“清除”)< /C>。除了不必要之外--

erase();refresh()
就足够了——它以诅咒者无法识别的方式改变屏幕。
int menuShow(string *choices, int opt, WINDOW *menu)

    ... STUFF

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