2014-11-21 2 views
4

Я программирую новую сервер-клиентскую сеть для игры Crysis Wars. У меня есть функция, которая центрирует строку на количество символов, поддерживаемых per-line в окне консоли. Окно соответствует 113 символам, но я установил максимальную ширину символа в моей функции на 111, чтобы хорошо подобрать текст.Неожиданные символы в консольном выводе

Это моя функция:

string Main::CenterText(string s) 
{ 
    return string((111 - s.length())/2, ' ') + s; 
} 

Эта функция от question I asked last year, но я тем не менее я не уверен, закончился ли я до его использования или нет в прошлых проектах.

Я пытаюсь использовать эту функцию в этом контексте (функция CryLogAlways просто записывает строку в игре сервер логфайл/и выводит его на экран):

CryLogAlways(CenterText(" ____  ____  _ __  _ _ __").c_str()); 
CryLogAlways(CenterText("/_/__/_(_)__ (_) /___ _()| |/_/").c_str()); 
CryLogAlways(CenterText(" _/ // _ \\/ _//_ \\//__/ // //_> < ").c_str()); 
CryLogAlways(CenterText("/___/_//_/_//_/_//_/_/\\__/\\_,//_/|_| ").c_str()); 
CryLogAlways(CenterText("       /___/   ").c_str()); 

Однако выход есть:

enter image description here

Аналогично, как @ deW1 просил, у меня есть аналогичный выход с CryLogAlways(CenterText("X").c_str());:

enter image description here

Почему я получаю этот выход и как я могу это исправить?

+0

Что такое вывод, если вы выполняете 'CryLogAlways (CenterText (« X »). C_str());'? – deW1

+0

@ deW1 http://puu.sh/cZEG8/7921d3bc39.png. Это странная проблема, я поставил вопрос. – cybermonkey

+0

Что вы подразумеваете под «Я, однако, не уверен, закончил ли я его использование или нет»? Вы уверены, что функция Main :: CenterText, которую вы показали, является фактической, которую вы используете? –

ответ

8

Вы используете тип string неквалифицированный. Я предполагал, что у вас есть using namespace std где-то (against best practice), что сделало бы string ссылкой на std::string. Но, по-видимому, это не так, и у вас есть неквалифицированное имя string, определенное что-то (вопрос не показывает, что), который ведет себя аналогично std::string (т. Е. Имеет .length() и .c_str()). Однако аргументы конструктора этого что-то выглядят в обратном порядке по сравнению с std::string.

Если вы хотите, чтобы ваша функция для работы со стандартными строками библиотеки, так сказать eplicitly:

std::string Main::CenterText(std::string s) 
{ 
    return std::string((111 - s.length())/2, ' ') + s; 
} 

Это яркий пример того, почему это чрезвычайно хорошая идея использовать явную квалификацию для std типов.

+0

* «Это яркий пример того, почему очень важно использовать явную квалификацию для типов std». * Я предпочел бы, чтобы CryTek использовал строку typedef CryString для использования этой плохой практики: интерфейс 'CryString 'выглядит очень похоже на' std :: string', я уверен, они пытались сделать его совместимым. – dyp

+0

Я продолжаю ссылаться на это, отличный ответ, поэтому я награждаю щедрость. Наградит за 23 часа. – cybermonkey

+1

@ ʎǝʞuoɯɹǝqʎɔ Спасибо; Я счастлив, что это было полезно. – Angew

2

Согласно C++ Reference, вы правы.

Как указано в комментариях, для используемой последовательности строк аргументы переключаются.

Для второго примера вы печатаете знак (111-1)/2 = 55 = '7' для '' = 32 раза. своп аргументы

string(' ',(111 - s.length())/2) 

и он должен работать лучше.

+0

Это на правильном пути. Компилятор явно не сопоставляет этот код с конструктором std :: string для 'string (size_t n, char c);' Но OP тестировался с использованием строковой константы «X» и получил тот же результат, так как это может быть не std :: string? –

+2

@RichardSchwartz ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string/basic_string) имеет конструктор, который сначала берет количество повторений, а затем повторяет символ. [CryString] (https://github.com/adithedude007/alecmercer-origins/blob/master/Code/CryEngine/CryCommon/CryString.h), с другой стороны, сначала повторяет символ, затем количество повторений. Так что Мартце имеет это в обратном направлении. – dyp

+0

Итак, я сделал ту же ошибку, что и в вопросе, но с эталонной версией. Вау. Исправлено. – Martze

Смежные вопросы