有没有办法通过 ncurses 库在 C++ 中打印字符串类型的变量?
Is there a way to print a string-type variable in C++ via the ncurses library?
我一直在尝试通过 ncurses 的函数打印出字符串类型变量,因为在我输入“initscr()”命令时“cout”不工作。我创建了一个字符串变量数组,我试图在 window 上打印每个字符串。我得到的结果是一些废话。这是我的代码中最关键的部分:
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();”之后打印出一个字符串类型的变量?行?
格式“%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 字符串(或 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++ 那样是 ss 类型安全的。在这种情况下,C 语言为 mvwprintw()
提供了可变数量的参数,不幸的是,这些参数的类型没有指定,因此编译器不会检查您是否传递了有效类型(因此没有警告或错误)。
注意:C++ 仍然提供这种旧式接口以向后兼容 C,但在更现代的 C++ 库中,您将使用模板可变参数,以便我们可以明确确保类型正确。
我一直在尝试通过 ncurses 的函数打印出字符串类型变量,因为在我输入“initscr()”命令时“cout”不工作。我创建了一个字符串变量数组,我试图在 window 上打印每个字符串。我得到的结果是一些废话。这是我的代码中最关键的部分:
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();”之后打印出一个字符串类型的变量?行?
格式“%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 字符串(或 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++ 那样是 ss 类型安全的。在这种情况下,C 语言为 mvwprintw()
提供了可变数量的参数,不幸的是,这些参数的类型没有指定,因此编译器不会检查您是否传递了有效类型(因此没有警告或错误)。
注意:C++ 仍然提供这种旧式接口以向后兼容 C,但在更现代的 C++ 库中,您将使用模板可变参数,以便我们可以明确确保类型正确。