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

Тема: sscanf

  1. #1
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±

    sscanf

    Приветствую, столкнулся с небольшой проблемкой, связанной с плагином "sscanf". Решение я знаю, но дело в том, что это не очень-то и помогает. Перейду к сути: имеется у меня две строки, выводимые одной командой (/sms), но длина строк у них разная:
    PHP код:
    format(stringsizeof(string), "[SMS] Сообщение: %s. Отправитель сообщения: %s. Тел.: %i"...);
    format(stringsizeof(string), "Сообщение доставлено. Текст: %s. Номер получателя: %i"...); 

    PHP код:
    if(sscanf(params"us[128]"params[0], params[1])) 
    Если использовать 128, то при большом кол-ве символов не отправляется одна из строк, ну а если меньше, то при переполнении буфера (или как это правильно называется) выскакивает следующее:
    PHP код:
    sscanf warningString buffer overflow
    Помогите решить проблемку, чтобы отправлялись обе строки, но при этом не было ошибочки в консоли.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Кинь всю кмд, чтобы можно было на ней же и показать как сделать
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Кинь всю кмд, чтобы можно было на ней же и показать как сделать
    Без лишнего мусора (проверок)
    PHP код:
    CMD:sms(playeridparams[])
    {
        if(
    sscanf(params"us[128]"params[0], params[1])) return SendClientMessage(playerid, -1"/sms [num] [text]");

        
    format(stringsizeof(string), "[SMS] Сообщение: %s. Отправитель сообщения: %s. Тел.: %i"params[1], pInfo[playerid][pName], pInfo[playerid][pNumber]); 
        
    SendClientMessage(params[0], -1string);

        
    format(stringsizeof(string), "Сообщение доставлено. Текст: %s. Номер получателя: %i"params[1], pInfo[params[0]][pNumber]); 
        
    SendClientMessage(playerid, -1string);
         return 
    true;


  4. #4
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Есть разные варианты.
    - Поставить ограничение на кол-во введенных символов.
    - Поставить ограничение на кол-во введенных символов.
    И конечно же , - оставить ограничение на кол-во введенных символов.

    Так-же SendClientMessage может содержать 144 символа, а не 128, 128 ограничение чата.

    PHP код:
    CMD:sms(playeridparams[])
    {
        new 
             
    targetid,
             
    massive[90];

        if(
    sscanf(params"us[90]"targetidmassive)) 
             return 
    SendClientMessage(playerid, -1"/sms [num] [text]");

        if(!(
    <= strlen(massive) <= 30))
             return 
    1;

        
    format(stringsizeof(string), "[SMS] Сообщение: %s. Отправитель сообщения: %s. Тел.: %i"massivepInfo[playerid][pName], pInfo[playerid][pNumber]); 
        
    SendClientMessage(targetid, -1string);

        
    format(stringsizeof(string), "Сообщение доставлено. Текст: %s. Номер получателя: %i"massivepInfo[targetid][pNumber]); 
        
    SendClientMessage(playerid, -1string);
        return 
    true;

    Ведь если в твоем SendClientMessage будет больше 144 символов, сообщение не будет отправлено.
    Последний раз редактировалось Long-; 09.06.2017 в 13:47.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    Есть разные варианты.
    - Поставить ограничение на кол-во введенных символов.
    - Поставить ограничение на кол-во введенных символов.
    И конечно же , - оставить ограничение на кол-во введенных символов.

    Так-же SendClientMessage может содержать 144 символа, а не 128, 128 ограничение чата.

    PHP код:
    CMD:sms(playeridparams[])
    {
        new 
             
    targetid,
             
    massive[90];

        if(
    sscanf(params"us[90]"targetidmassive)) 
             return 
    SendClientMessage(playerid, -1"/sms [num] [text]");

        if(!(
    <= strlen(massive) <= 30))
             return 
    1;

        
    format(stringsizeof(string), "[SMS] Сообщение: %s. Отправитель сообщения: %s. Тел.: %i"targetidpInfo[playerid][pName], pInfo[playerid][pNumber]); 
        
    SendClientMessage(targetid, -1string);

        
    format(stringsizeof(string), "Сообщение доставлено. Текст: %s. Номер получателя: %i"massivepInfo[targetid][pNumber]); 
        
    SendClientMessage(playerid, -1string);
        return 
    true;

    Ведь если в твоем SendClientMessage будет больше 144 символов, сообщение не будет отправлено.
    У тебя в первом форматировании ошибка (targetid вместо massive)
    Хотя вообще не совсем понятно зачем вся эта лишняя мишура с дополнительным текстом. Отправленные/полученные сообщения можно помечать обычными скобками "<<" и ">>".
    Ну а если очень нужно, можно сделать перенос сообщения на 2 строки, если оно слишком большое

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

    +- так
    PHP код:
    CMD:smss(playeridparams[]) 

        new  
            
    targetid
        

        if(
    sscanf(params"us[128]"targetidparams))  
            return 
    SendClientMessage(playerid, -1"/sms [id] [text]"); 


        new 
    len_params strlen(params),
            
    len_string,
            
    buff[MAX_CHATBUBBLE_LENGTH+1],
            
    msg_string[MAX_CHATBUBBLE_LENGTH+1];
        

        
    msg_string "[SMS] Сообщение: ";
        
    format(buffsizeof(buff), "Отправитель сообщения: %s. Тел.: %i"pInfo[playerid][pName], pInfo[playerid][pNumber]);
        
    len_string strlen(msg_string)+strlen(buff)+len_params;
        if(
    len_string <= MAX_CHATBUBBLE_LENGTH)
        {
            
    format(msg_stringsizeof(msg_string), "%s%s. %s"msg_stringparamsbuff);
            
    SendClientMessage(targetid, -1msg_string); 
        }
        else
        {
            
    format(msg_stringsizeof(msg_string), "%s%s."msg_stringparams);
            
    SendClientMessage(targetid, -1msg_string);
            
    SendClientMessage(targetid, -1buff);
            
        }



        
    msg_string "Сообщение доставлено. Текст: ";
        
    format(buffsizeof(buff), "Номер получателя: %i"pInfo[targetid][pNumber]);
        
    len_string strlen(msg_string)+len_params;
        if(
    len_string+strlen(buff) <= MAX_CHATBUBBLE_LENGTH)
        {
            
    format(msg_stringsizeof(msg_string), "%s%s. %s"msg_stringparamsbuff);
            
    SendClientMessage(playerid, -1msg_string); 
        }
        else
        {
            if(
    len_string <= MAX_CHATBUBBLE_LENGTH)
            {
                
    format(msg_stringsizeof(msg_string), "%s%s."msg_stringparams);
                
    SendClientMessage(playerid, -1msg_string);
                
    SendClientMessage(playerid, -1buff);
            }
            else
            {
                
    len_string 144-strlen(msg_string);
                
    format(msg_stringsizeof(msg_string), "%s%s"msg_stringparams);
                
    SendClientMessage(playerid, -1msg_string);
                
    format(msg_stringsizeof(msg_string), "%s. %s"params[len_string], buff);
                
    SendClientMessage(playerid, -1msg_string);
            }
        }
        return 
    true

    Последний раз редактировалось DeimoS; 09.06.2017 в 02:05.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    У тебя в первом форматировании ошибка (targetid вместо massive)
    Хотя вообще не совсем понятно зачем вся эта лишняя мишура с дополнительным текстом. Отправленные/полученные сообщения можно помечать обычными скобками "<<" и ">>".
    Ну а если очень нужно, можно сделать перенос сообщения на 2 строки, если оно слишком большое

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

    +- так
    PHP код:
    CMD:smss(playeridparams[]) 

        new  
            
    targetid
        

        if(
    sscanf(params"us[128]"targetidparams))  
            return 
    SendClientMessage(playerid, -1"/sms [id] [text]"); 


        new 
    len_params strlen(params),
            
    len_string,
            
    buff[MAX_CHATBUBBLE_LENGTH+1],
            
    msg_string[MAX_CHATBUBBLE_LENGTH+1];
        

        
    msg_string "[SMS] Сообщение: ";
        
    format(buffsizeof(buff), "Отправитель сообщения: %s. Тел.: %i"pInfo[playerid][pName], pInfo[playerid][pNumber]);
        
    len_string strlen(msg_string)+strlen(buff)+len_params;
        if(
    len_string <= MAX_CHATBUBBLE_LENGTH)
        {
            
    format(msg_stringsizeof(msg_string), "%s%s. %s"msg_stringparamsbuff);
            
    SendClientMessage(targetid, -1msg_string); 
        }
        else
        {
            
    format(msg_stringsizeof(msg_string), "%s%s."msg_stringparams);
            
    SendClientMessage(targetid, -1msg_string);
            
    SendClientMessage(targetid, -1buff);
            
        }



        
    msg_string "Сообщение доставлено. Текст: ";
        
    format(buffsizeof(buff), "Номер получателя: %i"pInfo[targetid][pNumber]);
        
    len_string strlen(msg_string)+len_params;
        if(
    len_string+strlen(buff) <= MAX_CHATBUBBLE_LENGTH)
        {
            
    format(msg_stringsizeof(msg_string), "%s%s. %s"msg_stringparamsbuff);
            
    SendClientMessage(playerid, -1msg_string); 
        }
        else
        {
            if(
    len_string <= MAX_CHATBUBBLE_LENGTH)
            {
                
    format(msg_stringsizeof(msg_string), "%s%s."msg_stringparams);
                
    SendClientMessage(playerid, -1msg_string);
                
    SendClientMessage(playerid, -1buff);
            }
            else
            {
                
    len_string 144-strlen(msg_string);
                
    format(msg_stringsizeof(msg_string), "%s%s"msg_stringparams);
                
    SendClientMessage(playerid, -1msg_string);
                
    format(msg_stringsizeof(msg_string), "%s. %s"params[len_string], buff);
                
    SendClientMessage(playerid, -1msg_string);
            }
        }
        return 
    true

    Исправил, ну перенос текста не совсем удачно, ибо получится уже как то не удачно, я пытался так сделать, но будто текст тупо слипается, либо поставить ограничение, либо помечать как ты сказал - "<<" и ">>", ну автору может и понравится перенос.

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    В каком смысле "слипаться"?
    Не знаю как правильно выразится, в чате отделены строки, особенно кто играет с timestamp(около самого текста, слева время), и можно подумать что это по сути вообще другое сообщение , не принадлежит первому, ну в общем думаю ты понял о чем я..
    По мне так не удобно :(

 

 

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

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

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

Ваши права

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