PDA

Просмотр полной версии : Как сравнить строки в C++



pashaintel
30.11.2008, 11:45
Привет. Столкнулся вот в SDK с такой проблемой. Может,кто нить из программистов поможет. Хочу выводить на экран персональное обращение к каждому игроку. Для этого использую:

CvWString fff;
CvWString ggg;
ggg = "Петр";
fff = getLeaderName(getOwnerINLINE());
if (fff == ggg)
{
... код
}

Проблема в том,что каждый раз условие не выполняется,хотя игрока зовут Петр. Весь код находится в CvCity.cpp. Может кто нить помочь?

ComInter
30.11.2008, 12:27
Дело тут не в С++, а в объекте CvWString, определенном в файле CvString.h.
Как таковой функции сравнения строк интерфейс объекта нам не предлагает, то следует использовать классический способ из библиотеки string.h.

Лично код не проверял, но думаю будет работать:

CvWString fff;
CvWString ggg;
ggg = "Петр";
fff = getLeaderName(getOwnerINLINE());
if (strcmp(fff,ggg)==0)
{
... код
}

или так


CvWString fff;
CvWString ggg;
ggg = "Петр";
fff = getLeaderName(getOwnerINLINE());
if (strcmp(fff.GetCString(),ggg.GetCString())==0)
{
... код
}

Возможно потребуется ещё привести типы исходя из сообщений компилятора.

General
30.11.2008, 12:32
Сначала подумал про концевые сиволы закрытия строк, про буквы е/ё, а ведь действительно получается, что выражение


(fff == ggg)


будет давать тру только если это один и тот же объект в памяти компьютера

pashaintel
30.11.2008, 13:35
Вот что плучается в первом случае:
CvCity.cpp
CvCity.cpp(4309) : error C2664: 'strcmp' : cannot convert parameter 1 from 'CvWString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Process terminated with status 2 (0 minutes, 8 seconds)
1 errors, 0 warnings

А вот что во втором:
CvCity.cpp
CvCity.cpp(4309) : error C2664: 'strcmp' : cannot convert parameter 1 from 'const wchar *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Process terminated with status 2 (0 minutes, 7 seconds)
1 errors, 0 warnings

ComInter
30.11.2008, 14:33
<div class='quotetop'>Цитата(Пашок * 30.11.2008, 15:35) 270489</div>

А вот что во втором:
CvCity.cpp
CvCity.cpp(4309) : error C2664: &#39;strcmp&#39; : cannot convert parameter 1 from &#39;const wchar *&#39; to &#39;const char *&#39;
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Process terminated with status 2 (0 minutes, 7 seconds)
1 errors, 0 warnings
[/b]
Думаю, тогда стоит переписать так:


CvWString fff;
CvWString ggg;
ggg = "Петр";
fff = getLeaderName(getOwnerINLINE());
if (wcscmp(fff.GetCString(),ggg.GetCString())==0)
{
... код
}

Здесь используется ф-ия wcscmp, которая работает с типами wchar*, аналогичная по функциональности strcmp.

pashaintel
30.11.2008, 15:40
Сейчас попробую. Кстати,эта функция >0 когда первое значение впереди по алфавиту?

pashaintel
30.11.2008, 16:05
Не работает. Проект компилится без ошибок,но условие не выполняется. Может,функция getLeaderName(getOwnerINLINE()) даёт не то,что надо.Как бы это проверить... Пробовал и просто getName(getOwnerINLINE()). Равенства нет.

ComInter
30.11.2008, 20:22
<div class='quotetop'>Цитата(Пашок * 30.11.2008, 18:05) 270523</div>

Не работает. Проект компилится без ошибок,но условие не выполняется. Может,функция getLeaderName(getOwnerINLINE()) даёт не то,что надо.Как бы это проверить... Пробовал и просто getName(getOwnerINLINE()). Равенства нет.
[/b]
Мне кажется, что тут нужен ещё объект, к которому можно применить данную ф-ию. А вот какой, это нужно поискать по SDK.
Кстати, ещё может быть проблема с кодировками. В окне редактора "Петр" - одна последовательность байт, а в игре может быть другая.

NeverMind
01.12.2008, 17:53
Если это просто игровое сообщение для игрока, то лучше делать его через питон, он для того и создан.