PDA

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



Gressie
18.11.2015, 09:24
Всем привет, хочу узнать как в команде сделать 1 необязательный параметр? сама команда с 1 параметром. То есть я ввожу /commands id игрока. Мне надо чтобы id игрока было необязательным.

Daniel_Cortez
18.11.2015, 10:38
Если команда на ZCMD/DC_CMD и в ней всего один параметр, то достаточно просто проверить строку params на пустоту.


CMD:commands(playerid, params[])
{
if (params[0] == '\0')
{
// ...
}
// ...
}

Gressie
18.11.2015, 13:16
Если команда на ZCMD/DC_CMD и в ней всего один параметр, то достаточно просто проверить строку params на пустоту.


CMD:commands(playerid, params[])
{
if (params[0] == '\0')
{
// ...
}
// ...
}


А если например: команда выглядела вот так:

CMD:commands(playerid, params[])
{
if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, -1, "Введите: /commands [id игрока]");

// Тут действия
return 1;
}
Как оно должно выглядеть сейчас? Если я не укажу ID то другие действия чтоб были.

Desulaid
18.11.2015, 13:45
А если например: команда выглядела вот так:

CMD:commands(playerid, params[])
{
if(sscanf(params, "u", params[0])) return SendClientMessage(playerid, -1, "Введите: /commands [id игрока]");

// Тут действия
return 1;
}
Как оно должно выглядеть сейчас? Если я не укажу ID то другие действия чтоб были.

Если сделать без возврата единицы в условии, то команда дальше будет работать, но сообщение будет мелькать.

Gressie
19.11.2015, 14:05
Ещё вопрос:
Имеется email адрес, он показывается в textdraw соответственно. Как сделать чтобы показывалась часть этого email адреса? В виде login. Полный адрес [email protected]

Daniel_Cortez
19.11.2015, 14:45
Ещё вопрос:
Имеется email адрес, он показывается в textdraw соответственно. Как сделать чтобы показывалась часть этого email адреса? В виде login. Полный адрес [email protected]
Вы как-то проверяете правильность адреса?

Desulaid
19.11.2015, 14:46
Набросал "функцию", работает :)


stock HidePlayerMain(email[])
{
for(new i; i < strfind(email, "@", true); i++)
{
email[i] = '*';
}
}

main()
{
new str_1[128] = "[email protected]";
printf("[До] %s", str_1);
HidePlayerMain(str_1);
printf("[После] %s", str_1);
}

Daniel_Cortez
19.11.2015, 16:30
Набросал "функцию", работает :)


stock HidePlayerMain(email[])
{
for(new i; i < strfind(email, "@", true); i++)
{
email[i] = '*';
}
}

main()
{
new str_1[128] = "[email protected]";
printf("[До] %s", str_1);
HidePlayerMain(str_1);
printf("[После] %s", str_1);
}
strfind вызывается на каждой итерации, когда можно всего один раз узнать нужную позицию.

Gressie
19.11.2015, 16:47
Вы как-то проверяете правильность адреса?

Регулярные выражения


strfind вызывается на каждой итерации, когда можно всего один раз узнать нужную позицию.

Тогда напишите как правильней.



Набросал "функцию", работает :)


stock HidePlayerMain(email[])
{
for(new i; i < strfind(email, "@", true); i++)
{
email[i] = '*';
}
}

main()
{
new str_1[128] = "[email protected]";
printf("[До] %s", str_1);
HidePlayerMain(str_1);
printf("[После] %s", str_1);
}

Я просил чтобы вообще удалялись @domain.ru и показ был только login.

L0ndl3m
19.11.2015, 16:55
Могу такой вариант предложить:


new
mail_str[32] = "[email protected]",
pos = strfind(mail_str, "@");

strmid(mail_str, mail_str, 0, (-1 == pos) ? sizeof(mail_str) : pos);
print(mail_str); // вывод "login"

Gressie
19.11.2015, 17:00
Могу такой вариант предложить:


new
mail_str[32] = "[email protected]",
pos = strfind(mail_str, "@");

strmid(mail_str, mail_str, 0, (-1 == pos) ? sizeof(mail_str) : pos);
print(mail_str); // вывод "login"


А как сделать чтобы @ не показывалась тоже? Показывался только login.
На данный момент показывает login@

L0ndl3m
19.11.2015, 17:12
https://i.gyazo.com/e6d7ef771c0022808dc5c79aeb2eb1f6.png
Эм?

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

Кстати вот ещё способ, без strmid:


new
mail_str[32] = "[email protected]",
pos = strfind(mail_str, "@");

if(-1 != pos)
mail_str[pos] = EOS;

print(mail_str); // вывод "login"


И без функций, с использованием цикла:


new
mail_str[32] = "[email protected]",
i = -1,
c;

while((c = mail_str[++i]) != EOS && c != '@'){}
mail_str[i] = EOS;
print(mail_str); // вывод "login"

Daniel_Cortez
19.11.2015, 17:22
ExtractNameFromEMailAddress(const in[], out[], size = sizeof(out))
{
static pos;
if ((pos = strfind(in, "@")) < 0)
return;
for (pos = (pos >= size) ? (size - 1) : (pos), out[pos] = '\0'; pos-- != 0;)
out[pos] = in[pos];
}

Gressie
19.11.2015, 17:54
ExtractNameFromEMailAddress(const in[], out[], size = sizeof(out))
{
static pos;
if ((pos = strfind(in, "@")) < 0)
return;
for (pos = (pos >= size) ? (size - 1) : (pos), out[pos] = '\0'; pos-- != 0;)
out[pos] = in[pos];
}


как использовать?

Daniel_Cortez
19.11.2015, 19:02
как использовать?
А разве не видно? Функция возвращает нужную часть из EMail-адреса через массив out.
Используется точно так же, как, например, GetPlayerName, только вместо ID игрока первой передаётся строка с адресом.

Gressie
23.11.2015, 20:53
Спасибо Daniel. Буду использовать твой вариант. Тему можно закрыть.