Я работаю над небольшой консольной игрой с ncurses. В главном меню я хочу, чтобы пользователь мог установить клавиши управления. Теперь, насколько я понял, в ncurses вы можете получить доступ к e.a. клавиша a по значению int символа ‘a’. Использование ключа в игре с «а» работает безупречно, однако я застрял с меню:
Для каждой привязки ключа я сохранил int-значение по умолчанию e.a. «А». Когда игра начинается, я правильно читаю привязку ‘a’ из int-значения и могу использовать ее в игре. Тем не менее, он не отображается правильно. Я хочу, чтобы это было так: «Слева: а». Я делаю это так:
std::string key = "Left: " + static_cast<char>(_value);
_value — это int-значение, которое я хранил и инициализировал как ‘a’. Я также попробовал это без броска, кстати.
Теперь то, что отображается, странно. Вместо «а» написано «~ T ^ C». Для букв «s» и «d» он вообще ничего не отображает. «w» становится очень странным кодированием вопросительных знаков.
Я предполагаю, что это как-то связано с кодировкой символов в int-значениях или чем-то еще. Так, что я могу сделать, чтобы это отображалось правильно?
Большое спасибо!
Вы складываете адрес строкового литерала и значение ASCII _value
, строка key
затем строится из того, что происходит по этому адресу мусора.
Помните, что строковые литералы имеют тип массива N const char
и что массивы затухают, чтобы указывать на их первый элемент при передаче в функции, операторы и т. д., что дает вам const char*
, Встроенный оператор + для указателей не выполняет конкатенацию строк. Вам нужно построить std::string
из хотя бы одного из операндов для перегруженного оператора, чтобы включить:
std::string key = std::string("Left: ") + static_cast<char>(_value);
Других решений пока нет …