Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12
  1. #1
    Аватар для Sersoftin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.08.2014
    Адрес
    Rostov-on-Don
    Сообщений
    29
    Репутация:
    8 ±

    Парсинг строк pawn

    Есть строка:
    new test[20] = "2014-10-28 00:40:00"; (например)
    Есть переменные:
    new year, month, day, hour, minut, second; (например)

    Необходимо распарсить строку и забить в эти переменные нужные данные.
    year = 2014;
    month = 10;
    day = 28;
    hour = 0;
    minut = 40;
    second = 0;

    sscanf отпадает, насколько я понял. Какие есть ещё не геморные способы, дабы не писать это все дело вручную? Может есть что-то.
    Yummy Role Play forever!

  2. #2
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Примерно так:

    Функция:
    PHP код:
    stock ParseString(const str[], dest[][], const maxlength sizeof(dest[]))
    {
        new
            
    pos,
            
    count,
            
    offset;

        do
        {
            switch(
    str[pos])
            {
                case 
    '-'' '':':
                {
                    
    strmid(dest[count++], stroffsetposmaxlength);
                    
    offset pos 1;
                }
            }
        }
        while(
    str[++pos] != EOS);

        if(
    str[pos] == 0)
            
    strmid(dest[count], stroffsetposmaxlength);

    Использование:
    PHP код:
    main()
    {
        new
            
    test_string[20] = "2014-10-28 00:40:00";

        new
            
    parse_str[6][5],
            
    year,
            
    month,
            
    day,
            
    hour,
            
    minute
            second
    ;

        
    ParseString(test_stringparse_str);

        
    year strval(parse_str[0]);
        
    month strval(parse_str[1]);
        
    day strval(parse_str[2]);
        
    hour strval(parse_str[3]);
        
    minute strval(parse_str[4]);
        
    second strval(parse_str[5]);

    Хотя вряд ли проще чем sscanf.
    Последний раз редактировалось L0ndl3m; 28.10.2014 в 21:17.

  3. #3
    Аватар для Sersoftin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.08.2014
    Адрес
    Rostov-on-Don
    Сообщений
    29
    Репутация:
    8 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Примерно так:

    Функция:
    PHP код:
    stock ParseString(const str[], dest[][], const maxlength sizeof(dest[]))
    {
        new
            
    pos,
            
    count,
            
    offset;

        do
        {
            switch(
    str[pos])
            {
                case 
    '-'' '':':
                {
                    
    strmid(dest[count++], stroffsetposmaxlength);
                    
    offset pos 1;
                }
            }
        }
        while(
    str[++pos] != EOS);

        if(
    str[pos] == 0)
            
    strmid(dest[count], stroffsetposmaxlength);

    Использование:
    PHP код:
    main()
    {
        new
            
    test_string[20] = "2014-10-28 00:40:00";

        new
            
    parse_str[6][5],
            
    year,
            
    month,
            
    day,
            
    hour,
            
    minute
            second
    ;

        
    ParseString(test_stringparse_str);

        
    year strval(parse_str[0]);
        
    month strval(parse_str[1]);
        
    day strval(parse_str[2]);
        
    hour strval(parse_str[3]);
        
    minute strval(parse_str[4]);
        
    second strval(parse_str[5]);

    Хотя вряд ли проще чем sscanf.
    sscanf отрабатывает на строках, где данные разделяются пробелами. Загуглить, как распарсить подобное им я так и не смог. Не нашел инфы.

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

    Думал насчет регулярок, плагин есть по ним. Но там все функции аля составить предкомпилированое регулярное выражение и по нему просто проверить строку, соответствует ли она ему (IsEmailValid, IsPasswordValid). А вытянуть данные по группам или ещё как-то нельзя (вроде :D). В том же C# или java это возможно.
    Yummy Role Play forever!

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Sersoftin Посмотреть сообщение
    sscanf отрабатывает на строках, где данные разделяются пробелами. Загуглить, как распарсить подобное им я так и не смог. Не нашел инфы.
    В sscanf можно установить любой разделитель. Например:
    PHP код:
    sscanf("6+6+11""p<+>iii"int1int2int3); 
    Разделителем станет знак сложения. В третьей версии sscanf Y-Less обещал поддержку нескольких разделителей сразу, но пока так и не сделал эту самую версию.
    Но ты можешь просто записывать в БД/файл данные в виде, который будет удобночитаем машине. Например, в аккаунте игрока дата будет хранится так:
    PHP код:
    "2014-10-28 00:40:00" 
    А уже при записи форматируй её в
    PHP код:
    2014|10|28|00|40|00 
    и тогда проблем никаких с конвертированием не будет (а со временем и сам привыкнешь читать данные в таком формате).

    Если же речь не о БД идёт, то делай всё наоборот: храни все данные изначально в виде отдельных переменных и уже при надобности их конвертируй в строку.

    А вообще тебе изначально стоило озвучить конечную цель (в какой системе это использоваться будет). Может всё гораздо проще
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Например, вот способ с использованием sscanf
    PHP код:
    new test_string[20] = "2014-10-28 00:40:00";
    new 
    pos strfind(test_string" "false);
    new 
    result[2][11];
    strmid(result[0], test_string0pos);
    strmid(result[1], test_stringpos+1strlen(test_string));
    new 
    yearmonthdayhourminutsecond;
    sscanf(result[0], "p<->iii"yearmonthday);
    sscanf(result[1], "p<:>iii"hourminutsecond); 
    В виде функции подобное реализовать можно, но не думаю, что оно будет удачнее варианта Londlem
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для Sersoftin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.08.2014
    Адрес
    Rostov-on-Don
    Сообщений
    29
    Репутация:
    8 ±
    Система бананов. Если дата разбана больше текущей - юзер в бане. Т.е. все сводится к сравнению даты и времени.

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

    Я вообще изначально спросил: есть ли какие стандартные средства или что-нибудь такое, что не потребует от меня лишних телодвижений и мозговой активности, а вы мне уже готовые функции :) Так не интересно... :) Ну, спасибо, сейчас посмотрим :)

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

    Наверное это будет лучшим выходом. Хранить в типе VARCHAR "2014|10|28|00|40|00" вот такое вот. Разницы не будет, я думаю. И на php взаимодействовать, если что тоже будет нормально. Спасибо всем :)
    Yummy Role Play forever!

  7. #7
    Аватар для #ball
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Rostov-on-Don
    Сообщений
    119
    Репутация:
    14 ±
    Попробуй для бана использовать UnixTime

  8. #8
    Аватар для Sersoftin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.08.2014
    Адрес
    Rostov-on-Don
    Сообщений
    29
    Репутация:
    8 ±
    Цитата Сообщение от #ball Посмотреть сообщение
    Попробуй для бана использовать UnixTime
    Да время я по-другому получаю текущее + дату.
    Yummy Role Play forever!

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Sersoftin Посмотреть сообщение
    Система бананов. Если дата разбана больше текущей - юзер в бане. Т.е. все сводится к сравнению даты и времени.
    Как уже и сказали выше, используй UnixTime. Его в любой момент с лёгкостью можно будет перевести в любой формат. И при сравнении проблем не будет
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #10
    Аватар для Sersoftin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.08.2014
    Адрес
    Rostov-on-Don
    Сообщений
    29
    Репутация:
    8 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как уже и сказали выше, используй UnixTime. Его в любой момент с лёгкостью можно будет перевести в любой формат. И при сравнении проблем не будет
    Не кайф к большим числам приближаться... При сравнении и так вроде проблем нет. Хотя памяти он займет поменьше наверное...
    Yummy Role Play forever!

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •