Неожиданные символы в выводе консоли
Я программирую новую сеть сервер-клиент для игры Crysis Wars. У меня есть функция, которая центрирует строку по количеству символов, поддерживаемых на строку в окне консоли. Окно вмещает 113 символов, но я установил максимальную ширину символов в моей функции 111
как хорошо вписаться в текст.
Это моя функция:
string Main::CenterText(string s)
{
return string((111 - s.length()) / 2, ' ') + s;
}
Эта функция взята из вопроса, который я задавал в прошлом году, но я не уверен, что в конечном итоге я использовал его или нет в прошлых проектах.
Я пытаюсь использовать эту функцию в этом контексте (CryLogAlways
функция просто записывает строку в лог-файл игры / сервера и печатает ее):
CryLogAlways(CenterText(" ____ ____ _ __ _ _ __").c_str());
CryLogAlways(CenterText(" / _/__ / _(_)__ (_) /___ _( )| |/_/").c_str());
CryLogAlways(CenterText(" _/ // _ \\/ _/ / _ \\/ / __/ // //_> < ").c_str());
CryLogAlways(CenterText("/___/_//_/_//_/_//_/_/\\__/\\_, / /_/|_| ").c_str());
CryLogAlways(CenterText(" /___/ ").c_str());
Однако вывод:
Точно так же, как @deW1 просил, у меня есть аналогичный вывод с CryLogAlways(CenterText("X").c_str());
:
Почему я получаю этот вывод, и как я могу это исправить?
2 ответа
Вы используете тип string
неквалифицированный. Я предполагал, что у вас есть using namespace std
где-то ( против лучшей практики), что сделало бы string
Ссылаться на std::string
, Но, видимо, это не так, и у вас есть неквалифицированное имя string
определяется чем-то (вопрос не показывает что), который ведет себя аналогично std::string
(то есть .length()
а также .c_str()
). Тем не менее, аргументы конструктора этого что-то, кажется, в обратном порядке, чем аргументы std::string
,
Если вы хотите, чтобы ваша функция работала со стандартными строками библиотеки, скажите явно:
std::string Main::CenterText(std::string s)
{
return std::string((111 - s.length()) / 2, ' ') + s;
}
Это яркий пример того, почему крайне полезно использовать явную квалификацию для std
типы.
Согласно C++ Reference, вы правы.
Как указано в комментариях, для используемой строковой реализации аргументы переключаются.
Во втором примере вы печатаете знак (111-1)/2 = 55 = '7' для ' ' = 32 раза. Поменяйте местами аргументы
string(' ',(111 - s.length()) / 2)
и это должно работать лучше.