Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение двух юникодовских строк 
:(
    Опции темы
Tensor146
Дата 18.2.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Всем доброго времени суток!
Мои проблемы с юникодом продолжаются.
Вот мой код:
Код

int testGameList(void)
{
//
if (( gameList = fopen ("gameList.txt", "r" )) == NULL)perror ("error");
//
char string[100];
int i=0;
int n=0;
DWORD pid=0;
WCHAR buf[100];
int flag=0;
fgets(string, 100, gameList);
n=atoi(string);
for (i=1;i<n;i++)
{
int test=0;
fgets(string, 100, gameList); 
swprintf(buf,50,L"%S", string);
pid = PIDByName(buf); // pid=0 когда такого процесса нет в списке запущенных
if (pid!=0) {flag=1;};
if (buf==L"mspaint.exe") {test=1;};
if ((pid!=0)&&(buf==L"FireWarr.exe")) {flag=2;};
}
fclose(gameList);
return flag;
};


Ну и еще приведу файл gameList.txt:
Код

27
SWRepublicCommando.exe
lotrbfme2.exe
RANGERS.exe
lotrbfme2ep1.exe
game.dat
POP.EXE
MotherloadGoldium.exe
il2fb.exe
War World.exe
OblivionLauncher.exe
Oblivion.exe
POP2.EXE
pop3.exe
FireWarr.exe
SC2.exe
GAME.EXE
Pirates!.exe
war3.exe
LaunchBFII.exe
BattlefrontII.exe
jasp.EXE
UAWEA.exe
ra3_1.12.game
Overlay.exe
homeworld.exe
Homeworld.exe
mspaint.exe


Суть в том, что программа почему-то успешно сравнивает только самую последнюю запись списка.
Т.е. если mspaint.exe записано в конце списка - то она вернет 1, а если, скажем, в середние - то вернет уже 0.
Причем самое интересное, что... ну, приложу скриншот, сами порадуетесь: 
http://s1.ipicture.ru/uploads/20120218/Y5GHEmsE.png

Буду благодарен, если мне объяснят, где я не прав?

Это сообщение отредактировал(а) Tensor146 - 18.2.2012, 15:02
PM MAIL   Вверх
Dem_max
Дата 18.2.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Код

if (buf==L"mspaint.exe")

Так в Си строки не сравнивают, используй wcscmpi(), wcscmp()

Это сообщение отредактировал(а) Dem_max - 18.2.2012, 16:07


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Tensor146
Дата 18.2.2012, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



ух я дурак........
Прошу прощения, бес попутал. сто лет со строками не работал, на автомате ересь написал >_<

Хотя стоп... согласен, со сравнением я облажался, но PIDbyname-то не требует проверки!!!
Почему она выдает разные результаты, в зависимости от положения строки в списке?
wcscmp(buf,L"mspaint.exe")==1, кстати.
почему только, я не понимаю.

Это сообщение отредактировал(а) Tensor146 - 18.2.2012, 16:55
PM MAIL   Вверх
feodorv
Дата 18.2.2012, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Tensor146 @  18.2.2012,  16:42 Найти цитируемый пост)
Почему она выдает разные результаты, в зависимости от положения строки в списке?

Элементарно:

Цитата(Tensor146 @  18.2.2012,  15:00 Найти цитируемый пост)
fgets(string, 100, gameList); 

захватывает перевод строки '\n', который затем переходит в буфер buf, а потом и в функцию PIDByName. Последняя строка, видимо, записана без '\n', поэтому для последней записи всё работает  smile 

Это сообщение отредактировал(а) feodorv - 18.2.2012, 20:19


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
tzirechnoy
Дата 18.2.2012, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Это потому, что у Вас присваивание test=0 стоит в начале цыкла.
PM MAIL   Вверх
feodorv
Дата 18.2.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(tzirechnoy @  18.2.2012,  21:46 Найти цитируемый пост)
Это потому, что у Вас присваивание test=0 стоит в начале цыкла. 

И что из этого?  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tensor146
Дата 19.2.2012, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  18.2.2012,  20:17 Найти цитируемый пост)
захватывает перевод строки '\n', который затем переходит в буфер buf, а потом и в функцию PIDByName. Последняя строка, видимо, записана без '\n', поэтому для последней записи всё работает 

И.... как мне быть? Оо
Как убрать \n или не захватывать его? Оо
PM MAIL   Вверх
feodorv
Дата 19.2.2012, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Tensor146 @  19.2.2012,  07:42 Найти цитируемый пост)
И.... как мне быть?

Ну, например, так:
Код

{
  int len = strlen(string);
  if( len > 0 && string[len-1] == '\n' ) string[len-1] = '\0';
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.