Просмотр полной версии : [Вопрос] Sscanf
Всем привет, хочу узнать как в команде сделать 1 необязательный параметр? сама команда с 1 параметром. То есть я ввожу /commands id игрока. Мне надо чтобы id игрока было необязательным.
Daniel_Cortez
18.11.2015, 10:38
Если команда на ZCMD/DC_CMD и в ней всего один параметр, то достаточно просто проверить строку params на пустоту.
CMD:commands(playerid, params[])
{
if (params[0] == '\0')
{
// ...
}
// ...
}
Если команда на 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 то другие действия чтоб были.
Если сделать без возврата единицы в условии, то команда дальше будет работать, но сообщение будет мелькать.
Ещё вопрос:
Имеется 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 вызывается на каждой итерации, когда можно всего один раз узнать нужную позицию.
Вы как-то проверяете правильность адреса?
Регулярные выражения
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.
Могу такой вариант предложить:
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"
Могу такой вариант предложить:
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@
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];
}
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 игрока первой передаётся строка с адресом.
Спасибо Daniel. Буду использовать твой вариант. Тему можно закрыть.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot