Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 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
    Аватар для Londlem
    Модератор

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Сообщений
    1,360
    Репутация:
    767 ±
    Примерно так:

    Функция:
    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.
    Последний раз редактировалось Londlem; 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от 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 
    и тогда проблем никаких с конвертированием не будет (а со временем и сам привыкнешь читать данные в таком формате).

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Например, вот способ с использованием 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
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 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
    Сообщений
    120
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от Sersoftin Посмотреть сообщение
    Система бананов. Если дата разбана больше текущей - юзер в бане. Т.е. все сводится к сравнению даты и времени.
    Как уже и сказали выше, используй UnixTime. Его в любой момент с лёгкостью можно будет перевести в любой формат. И при сравнении проблем не будет
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

 

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

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

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

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

Ваши права

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