Просмотр полной версии : Как сравнить строки в 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)
{
... код
}
Возможно потребуется ещё привести типы исходя из сообщений компилятора.
Сначала подумал про концевые сиволы закрытия строк, про буквы е/ё, а ведь действительно получается, что выражение
(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: '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
[/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
Если это просто игровое сообщение для игрока, то лучше делать его через питон, он для того и создан.
Powered by vBulletin® Version 4.1.9 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot