PDA

Просмотр полной версии : [Вопрос] strcmp



PawnoNoob
14.08.2016, 21:19
Доброго времени суток.
Я ещё не совсем разобрался в функции strcmp, поэтому после моего вопроса не нужно обзываться :victory:

По порядку: в базе данных имеется строка, значение которой по умолчанию равно нулю. Эта строка загружается вместе с данными после ввода пароля. В самой строке могут храниться данные, состоящие из букв и символов.
Теперь сам вопрос: при вводе одной из команд вызывается форвард, в котором происходят определённые действия и нужно сделать так, чтобы при сравнении загружаемой строки и самого нуля показывался диалог (если строка равна нулю), если же загружаемая строка не равна нулю, то выполняется другое действие. Как это нужно реализовывать?

$continue$
14.08.2016, 22:23
Использовать функцию isnull?

PawnoNoob
14.08.2016, 23:00
Использовать функцию isnull?

А можно подробнее? Не слышал о такой:dntknw:

VVWVV
14.08.2016, 23:56
А можно подробнее? Не слышал о такой:dntknw:

Данная функция, точнее макрос, проверяет строку на заполненность. Она возвращает лишь два значения: правда(true), если первый символ строки нуль, либо же - ложь, если первый символ ненулевой.

PawnoNoob
15.08.2016, 00:45
Данная функция, точнее макрос, проверяет строку на заполненность. Она возвращает лишь два значения: правда(true), если первый символ строки нуль, либо же - ложь, если первый символ ненулевой.

А как его записать в strcmp?

$continue$
15.08.2016, 01:43
Функция есть в DC_CMD, mysql (blueg) и т.д.
Если не используйте данные плагины, то я возьму макрос из DC_CMD:


#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))

PawnoNoob
15.08.2016, 02:50
Функция есть в DC_CMD, mysql (blueg) и т.д.
Если не используйте данные плагины, то я возьму макрос из DC_CMD:


#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))


Хм, странный вопрос сейчас "пролетит": а если использую и то и то? :grin: Ну, как использовать этот макрос?
Вот так?

if(strcmp(isnull(PlayerInfo[playerid][название строки]), PlayerInfo[playerid][название строки], true) == 0)
Или нет?

$continue$
15.08.2016, 05:37
if(isnull(array))
{
// строка пустая
}
else
{
// строка не пустая
}

PawnoNoob
15.08.2016, 17:20
if(isnull(array))
{
// строка пустая
}
else
{
// строка не пустая
}


Всё равно else выполняется почему-то, пробовал вставить и pInfo, и добавить новый параметр в форварде и паблике - эффекта нет, выполняется else, при этом ошибок при компилировании нет.

$continue$
15.08.2016, 20:25
Предлагаю перед условием использовать print для вывода строки, что бы узнать что находится в ней.

PawnoNoob
15.08.2016, 20:58
Предлагаю перед условием использовать print для вывода строки, что бы узнать что находится в ней.

Вот.
http://i.imgur.com/xSNx6u7.png

Desulaid
15.08.2016, 21:39
Хм, странный вопрос сейчас "пролетит": а если использую и то и то? :grin: Ну, как использовать этот макрос?
Вот так?

if(strcmp(isnull(PlayerInfo[playerid][название строки]), PlayerInfo[playerid][название строки], true) == 0)
Или нет?


И какую цель вы хотите достичь этим кодом? Сравнить пустые строки?)) А ведь он даже не скомпилируется ...
Смысл сравнить строки есть в том случаи, если они заполнены не нулями.


new str1[7] = "Строка",
str2[7] = "qwerty";

if (isnull(str2))
{
print("Я вызываюсь, чтобы пустые строки сравнивать чтоле?!");
}
else
{
if (!strcmp(str1, str2))
{
print("Строки одинаковы!");
}
else
{
print("Строки разные!");
}
}

PawnoNoob
16.08.2016, 00:00
И какую цель вы хотите достичь этим кодом? Сравнить пустые строки?)) А ведь он даже не скомпилируется ...
Смысл сравнить строки есть в том случаи, если они заполнены не нулями.


new str1[7] = "Строка",
str2[7] = "qwerty";

if (isnull(str2))
{
print("Я вызываюсь, чтобы пустые строки сравнивать чтоле?!");
}
else
{
if (!strcmp(str1, str2))
{
print("Строки одинаковы!");
}
else
{
print("Строки разные!");
}
}

Ну блин, не надо только прикалываться надо мной, я ведь ещё не обладаю такими знаниями в данной области, чтобы помогать другим, например. :mosking:

Desulaid
16.08.2016, 00:06
Ну блин, не надо только прикалываться надо мной, я ведь ещё не обладаю такими знаниями в данной области, чтобы помогать другим, например. :mosking:

Иногда лучше сначала попробовать скомпилировать свой код. Говорят, помогает в решении многих проблем)) Как я только что: скомпилировал код выше, но почему-то результат не выводился в консоли. Я минут 5 сидел и тыкал, ковырял код, а потом понял, что компилирую не с тем флагом. Был -a. Фейлы везде)

PawnoNoob
16.08.2016, 00:11
Иногда лучше сначала попробовать скомпилировать свой код. Говорят, помогает в решении многих проблем)) Как я только что: скомпилировал код выше, но почему-то результат не выводился в консоли. Я минут 5 сидел и тыкал, ковырял код, а потом понял, что компилирую не с тем флагом. Был -a. Фейлы везде)

Я, если честно, всё равно не понял, что нужно делать для того, чтобы это "дело" заработало. Как я понял, использовать Strcmp вообще не вариант, а при использовании isnull выполняется else.

Desulaid
16.08.2016, 00:11
Я, если честно, всё равно не понял, что нужно делать для того, чтобы это "дело" заработало. Как я понял, использовать Strcmp вообще не вариант, а при использовании isnull выполняется else.

Покажи код, который ты использовал.

$continue$
16.08.2016, 00:32
Такой пример сойдет?


#include <a_samp>
#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
main()
{
new str1[20];
print("1)");
PrintIsNullString(str1);
print("2)");
strcat(str1, "not null");
PrintIsNullString(str1);

}
PrintIsNullString(str[])
{
if(isnull(str))
{
print("Строка пустая");
}
else print("Cтрока не пустая");
}

Desulaid
16.08.2016, 00:44
Такой пример сойдет?


#include <a_samp>
#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
main()
{
new str1[20];
print("1)");
PrintIsNullString(str1);
print("2)");
strcat(str1, "not null");
PrintIsNullString(str1);

}
PrintIsNullString(str[])
{
if(isnull(str))
{
print("Строка пустая");
}
else print("Cтрока не пустая");
}


ИМХО, тут перегруз информацией: функции PrintIsNullString() и strcat(). Кстати, название функции ни о чем))

PawnoNoob
16.08.2016, 00:56
Покажи код, который ты использовал.

В том-то и дело, что я его удалил. Ну я делал сначала isnull(pInfo[playerid]...), а потом добавил в сам паблик, выполняющийся при вводе команды, новый параметр. Всё равно и там и там выполнялся else.

Desulaid
16.08.2016, 01:01
В том-то и дело, что я его удалил. Ну я делал сначала isnull(pInfo[playerid]...), а потом добавил в сам паблик, выполняющийся при вводе команды, новый параметр. Всё равно и там и там выполнялся else.

Это точно ошибка в коде. Потому что даже тот вариант, что я скинул, работает хорошечно. :good:

PawnoNoob
16.08.2016, 02:23
Это точно ошибка в коде. Потому что даже тот вариант, что я скинул, работает хорошечно. :good:

Вот этот?

new str1[7] = "Строка",
str2[7] = "qwerty";

if (isnull(str2))
{
print("Я вызываюсь, чтобы пустые строки сравнивать чтоле?!");
}
else
{
if (!strcmp(str1, str2))
{
print("Строки одинаковы!");
}
else
{
print("Строки разные!");
}
}

- - - Добавлено - - -

Чтобы не создавать курилку в данной теме, просто для примера напишу систему (не ту, что хотел реализовать я, из совпадений лишь запрос и паблик), в которой всё конкретно будет расписано:


CMD:test(playerid
{
new query[много-много];
format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `number` = '%i'", PlayerInfo[playerid][number]);
mysql_function_query(mysql, query, true, "Название", "i", playerid);
}
теперь сам паблик:

public Название(playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
// здесь нужно сравнить с нулём, допустим, PlayerInfo[playerid][Test].
// если PlayerInfo[playerid][Test] равно нулю, то показываем определённый диалог.
if....
{
ShowPlayerDialog....
}
// если же не равно нулю, то выполняем другое действие.
else
{
SendClientMessage...
}
return 1;
}
}
Теперь немного о PlayerInfo[playerid][Test]:

Загружается при авторизации после ввода пароля.
В базе данных имеет значение по умолчанию 0.

Вот, вроде бы всё. :) Не могу понять, что нужно сделать, чтобы найти 0 в PlayerInfo[playerid][Test].
В общем, всё подробно расписано вот здесь (http://pro-pawn.ru/showthread.php?14180-strcmp&p=76297&viewfull=1#post76297), ну и вот тута (http://pro-pawn.ru/showthread.php?14180-strcmp&p=76342&viewfull=1#post76342) видно, что это "дело" загружается из базы данных при авторизации и оно равно нулю.

Desulaid
16.08.2016, 02:43
Вот этот?

new str1[7] = "Строка",
str2[7] = "qwerty";

if (isnull(str2))
{
print("Я вызываюсь, чтобы пустые строки сравнивать чтоле?!");
}
else
{
if (!strcmp(str1, str2))
{
print("Строки одинаковы!");
}
else
{
print("Строки разные!");
}
}

- - - Добавлено - - -

Чтобы не создавать курилку в данной теме, просто для примера напишу систему (не ту, что хотел реализовать я, из совпадений лишь запрос и паблик), в которой всё конкретно будет расписано:


CMD:test(playerid
{
new query[много-много];
format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `number` = '%i'", PlayerInfo[playerid][number]);
mysql_function_query(mysql, query, true, "Название", "i", playerid);
}
теперь сам паблик:

public Название(playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
// здесь нужно сравнить с нулём, допустим, PlayerInfo[playerid][Test].
// если PlayerInfo[playerid][Test] равно нулю, то показываем определённый диалог.
if....
{
ShowPlayerDialog....
}
// если же не равно нулю, то выполняем другое действие.
else
{
SendClientMessage...
}
return 1;
}
}
Теперь немного о PlayerInfo[playerid][Test]:

Загружается при авторизации после ввода пароля.
В базе данных имеет значение по умолчанию 0.

Вот, вроде бы всё. :) Не могу понять, что нужно сделать, чтобы найти 0 в PlayerInfo[playerid][Test].
В общем, всё подробно расписано вот здесь (http://pro-pawn.ru/showthread.php?14180-strcmp&p=76297&viewfull=1#post76297), ну и вот тута (http://pro-pawn.ru/showthread.php?14180-strcmp&p=76342&viewfull=1#post76342) видно, что это "дело" загружается из базы данных при авторизации и оно равно нулю.

А так не сработает?


public Название(playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
if (isnull(PlayerInfo[playerid][Test]))
{
// пусто
}
else
{
// не пусто
}
}
return 1;
}
Можно в БД указывать на "пустую строку" некое слово, 'none' например))

PawnoNoob
16.08.2016, 02:47
А так не сработает?


public Название(playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
if (isnull(PlayerInfo[playerid][Test]))
{
// пусто
}
else
{
// не пусто
}
}
return 1;
}
Можно в БД указывать на "пустую строку" некое слово, 'none' например))

Я пробовал так делать, выполнялся else всё равно:wacko:
Насчёт слова думаю, что пусть будет ноль лучше:mosking:

Desulaid
16.08.2016, 09:09
Я пробовал так делать, выполнялся else всё равно:wacko:
Насчёт слова думаю, что пусть будет ноль лучше:mosking:

Узнай тогда первый символ строки, может он и не пустой вовсе.


printf("%c", PlayerInfo[playerid][Test][0])

Nash_Brigers
16.08.2016, 11:49
Проще можно сделать, если в строке только "символы и буквы":

new
string_1[10] = "привет",
string_2[10];

if(string_1[1])
{
//второй символ занят - выдаст истину
}
else{}

if(string_2[1]){}
else
{
//второй символ не занят - выдаст false
}Это мой личный загон, не навязываю метод)
p.s. не обязательно именно с вторым символом мутить, смысл думаю ясен.

PawnoNoob
16.08.2016, 13:11
Узнай тогда первый символ строки, может он и не пустой вовсе.


printf("%c", PlayerInfo[playerid][Test][0])

Дык он нулю равен, не пустой.

Desulaid
16.08.2016, 13:19
Дык он нулю равен, не пустой.

Тогда смысла на пустой символ сравнивать нет. Можно тупо тогда

if (хз[0] == '0')
{

}

Или по методу Nash_Brigers можно.

Daniel_Cortez
16.08.2016, 13:27
Проще можно сделать, если в строке только "символы и буквы":

new
string_1[10] = "привет",
string_2[10];

if(string_1[1])
{
//второй символ занят - выдаст истину
}
else{}

if(string_2[1]){}
else
{
//второй символ не занят - выдаст false
}Это мой личный загон, не навязываю метод)
p.s. не обязательно именно с вторым символом мутить, смысл думаю ясен.
Подойдёт только для массивов, в которых 2 и более ячеек.
Если же в массиве всего одна ячейка - выйдешь за его пределы.

PawnoNoob
16.08.2016, 14:16
Тогда смысла на пустой символ сравнивать нет. Можно тупо тогда

if (хз[0] == '0')
{

}

Или по методу Nash_Brigers можно.

Хм, если честно, то я даже и не знал, что можно вставлять значения в кавычки.
Сделал вот так:

if(PlayerInfo[playerid[Test] != '0')
{
// здесь выполняем действие.
}
else
{
// а здесь показываем диалог.
}
Правильно ли будет? :blush2:
(за табуляцию извиняйте, в браузере вроде как незя)

Desulaid
16.08.2016, 14:28
Хм, если честно, то я даже и не знал, что можно вставлять значения в кавычки.
Сделал вот так:

if(PlayerInfo[playerid[Test] != '0')
{
// здесь выполняем действие.
}
else
{
// а здесь показываем диалог.
}
Правильно ли будет? :blush2:
(за табуляцию извиняйте, в браузере вроде как незя)

А попробовать? Можно так.


main()
{
new str[3] = "qw";
if (str[0] != 'q')
{
print("Первый символ - не \'q\'");
}
if (str[0] == 'q')
{
print("Первый символ - \'q\'");
}
}
Поэкспериментируй)


Подойдёт только для массивов, в которых 2 и более ячеек.
Если же в массиве всего одна ячейка - выйдешь за его пределы.

Если массив с предопределенным размером, то ничего страшно не будет.

PawnoNoob
16.08.2016, 15:19
А попробовать? Можно так.


main()
{
new str[3] = "qw";
if (str[0] != 'q')
{
print("Первый символ - не \'q\'");
}
if (str[0] == 'q')
{
print("Первый символ - \'q\'");
}
}
Поэкспериментируй)



Если массив с предопределенным размером, то ничего страшно не будет.

Ну а в чём отличие между первым и вторым? Первый, который я написал, вроде как работает:dance:

Desulaid
16.08.2016, 16:04
Ну а в чём отличие между первым и вторым? Первый, который я написал, вроде как работает:dance:

Вот например твой строка

some_text[2] = "0";

В этой строке только один символ - ноль. Вариант Nash_Brigers: пропустить первый символ и проверить следующий. Если следующий символа - это '\0', то вот строку пустая.


if (some_text[1] == '\0')
{
// ...
}

Так так можешь сэкономить в длинной строке аж пол секунды!


cmd:say(playerid, params[])
{
if (isnull(params))
{
SendClientMessage(playerid, -1, "Введите хоть что-нибудь!");
return 1;
}
if (params[30] != '\0')
{
SendClientMessage(playerid, -1, "Вы можете ввести не более 30 символов!");
return 1;
}
SendClientMessage(playerid, -1, params);
return 1;
}

Что-то вроде подобного зашквара))

Nash_Brigers
16.08.2016, 16:14
Подойдёт только для массивов, в которых 2 и более ячеек.
Если же в массиве всего одна ячейка - выйдешь за его пределы.
Ну автор то именно "строку" имел ввиду.. В строке явно не 1 символ.. Да даже если и один - по первому символу смотреть (символ '0' прочтётся как 48 в int значении (про остальные символы не в курсе)).
p.s. может я что-то не так понимаю т.к. слегка выпил)

PawnoNoob
16.08.2016, 16:49
Ну автор то именно "строку" имел ввиду.. В строке явно не 1 символ.. Да даже если и один - по первому символу смотреть (символ '0' прочтётся как 48 в int значении (про остальные символы не в курсе)).
p.s. может я что-то не так понимаю т.к. слегка выпил)

Дак просто если эта "строка" равна нулю, то показываем диалог с вводом информации (буквы, цифры, символы), а если он не равен нулю (заполнен буквами, цифрами, символами), то сообщаем ему об этом в SendClientMessage.

Nash_Brigers
16.08.2016, 20:35
del