在C++中使用ncurses读取字符串

4

我将要翻译一篇关于IT技术的文章,内容包括如何在C++中编写文本游戏,以及如何从ncurses中读取单个字符。在游戏中,我需要让用户输入对应于不同玩家的用户名。

目前,我使用以下代码从ncurses中读取单个字符:

move(y,x);
printw("Enter a char");
int char = getch();

然而,我不确定如何处理一个字符串。我正在寻找类似以下的内容:

move(y,x);
printw("Enter a name: ");
std::string name = getstring();

我看过许多关于使用ncurses的指南,每个指南都使用了不同的函数集,而且一个指南使用的函数另一个可能不用。据我所知,弃用和非弃用函数之间的界限并没有很好地定义。


1
http://invisible-island.net/ncurses/man/curs_getstr.3x.html - indiv
1个回答

10

这个怎么样?

std::string getstring()
{
    std::string input;

    // let the terminal do the line editing
    nocbreak();
    echo();

    // this reads from buffer after <ENTER>, not "raw" 
    // so any backspacing etc. has already been taken care of
    int ch = getch();

    while ( ch != '\n' )
    {
        input.push_back( ch );
        ch = getch();
    }

    // restore your cbreak / echo settings here

    return input;
}

我不建议使用另一种*scanw()函数族。您将需要处理一个临时的char []缓冲区,还要处理底层的*scanf()功能及其所有问题,同时*scanw()的规范说明它返回ERROK而不是扫描到的项目数,进一步降低了它的有用性。
虽然用户indiv建议使用getstr()看起来比*scanw()更好,并且对函数键进行了特殊处理,但它仍需要一个临时的char [],在C++代码中我尽量避免使用这些,即使只是为了避免任意缓冲区大小。

如果我们不使用UTF-8,你的代码可以正常工作。我注意到,当我们使用ch = getch();然后input.push_back(ch);时,实际上输入的不是1个字符,而是2个字符。当我们删除时,它们会逐个删除。我的意思是,为了在屏幕上删除一个字符,我们必须按两次“删除”按钮。我该如何解决这个问题? - Andrew Kusachev
@AndrewKusachev:nwcurses是ncurses的宽字符扩展。 - DevSolar
我正在使用-lncursesw标志编译您的代码,但仍然出现相同的错误:2次推送del以删除字符。 - Andrew Kusachev
这很有趣,因为getstr();也有这个问题。我正在用俄语进行测试。 - Andrew Kusachev
@AndrewKusachev:在那方面我真的帮不上你什么忙;我只是为一个自雇项目尝试过ncurses,那之后再也没有碰过这个库了。 - DevSolar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接