Problem sa sscanf

Započeo .Drakula., Avgust 10, 2018, 00:31:33 PRE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Problem(error/warning): Imam problem sa ssanf. Nisam bas nesto naucio oko njega, jos uvek ucim. Izbauje mi Debug, kod je dole.
Problem je u liniji:            if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");          .Moze li mi neko pokazati kako i sta da uradim jer imam na nekoliko mesta u skripti slicnu stvar.

Dio skripte: [pawn]
       new akcija[6];
       if(sscanf(params, "s[6]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[90];
         if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }
[/pawn]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log):
sscanf warning: String buffer overflow.
Slika/video ingame problema(obavezno ako je ingame problem): //
Poslednja Izmena: Avgust 12, 2018, 01:03:58 PRE PODNE od Bašovski

Postavi [pawn]new akcija[6+5];[/pawn]

if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Citat: buLLeT_ poslato Avgust 10, 2018, 10:31:42 PRE PODNE
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
Cemu ovo? Bukvalno si iskopirao kod koji je Dragan_Milosavljevic poslao.
Oduvek sam se pitao:
"Zbog cega se ljudi toliko brinu jedni za druge?",
"Zasto ljudi daju sve od sebe da usrece neku osobu?"

Najjednostavnije receno brinu se jer vole tu osobu celim svojim srcem,
daju sve od sebe da je usrece zbog toga sto ne zele da je ikada vide tuznom ili rasplakanom.
#xsarnaaparatima..

Nije isto kod.

Moj:
if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Komanda radi, daje usd normalno i daje eur normalno ali mi baca
sscanf warning: String buffer overflow.

Citat: Dragan_Milosavljevic poslato Avgust 10, 2018, 14:17:23 POSLE PODNE
Nije isto kod.

Moj:
if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Komanda radi, daje usd normalno i daje eur normalno ali mi baca
sscanf warning: String buffer overflow.
Je si li uradio ovo sto ti rekoh? Probaj staviti vrednost akcije vece od same nje

Citat: ᴢɪᴠᴋᴏᴠɪá´,, poslato Avgust 10, 2018, 15:56:14 POSLE PODNE
Je si li uradio ovo sto ti rekoh? Probaj staviti vrednost akcije vece od same nje
Uradio sam ovako:
[pawn]new akcija[15];
       if(sscanf(params, "s[15]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[98];
         if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
                        if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolar/a.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d euro/a.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }[/pawn]
Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
[pawn]if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");[/pawn]
To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
[pawn]if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");[/pawn]
Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
[pawn]sscanf warning: String buffer overflow.[/pawn]

Citat: Dragan_Milosavljevic poslato Avgust 10, 2018, 16:20:13 POSLE PODNE
Uradio sam ovako:
[pawn]new akcija[15];
       if(sscanf(params, "s[15]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[98];
         if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
                        if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolar/a.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d euro/a.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }[/pawn]
Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
[pawn]if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");[/pawn]
To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
[pawn]if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");[/pawn]
Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
[pawn]sscanf warning: String buffer overflow.[/pawn]
lool zasto u parametru %i a ne %d? stavi %d pa mi reci sta kaze

PS: moja greska
mislio sam na ' "s[15]s[4]i" ' da stavis ovako ' "s[15]s[4]d" '

Citat: ᴢɪᴠᴋᴏᴠɪá´,, poslato Avgust 10, 2018, 16:28:55 POSLE PODNE
PS: moja greska
mislio sam na ' "s[15]s[4]i" ' da stavis ovako ' "s[15]s[4]d" '
Razumeo sam sta si hteo da kazes, stavio sam ali se isto ponavlja
Ako ja ukucam /agiveall money usd 9999999999
Izbaci mi
sscanf warning: String buffer overflow.
verovatno cim prekoracim ovo: akcija[15]
Desi se isto kao gore sto sam ti obijasnio.
Poslednja Izmena: Avgust 10, 2018, 16:59:45 POSLE PODNE od Dragan_Milosavljevic

Citiracu Alexa(yless-a): "Actually it means that the string you tried to store in the buffer is longer than the specified string." probaj ga povecati pa vidi debugaj probaj pa javi sta kaze

jer sam ja na fonu sad pa cu kada budem PC proveriti kod

Ako mozes da mi pomognes bio bi ti zahvalan.
Meni se desava ovako nesto:
http://forum.sa-mp.com/showthread.php?t=304609

Ako moze neko od iskusnijih da pogleda, ako ne postoji resenje za ovaj problem kako bi mogao da preradim komandu.?

 evo ti nesto lakse na moj nacin / preradjena komanda,nemam vremena da ti ispravljam tvoju trenutno zurim idem negdje pa sam ti zacas ispisao na moj nacin / preradio komandu, uglavnom stavio sam velicinu sta 15 da mozes stavit moneyusd ili moneyeuro ili money-usd ili money-euro,ja sam stavio monusd i moneuro, mozes izmijenit kako zelis
[pawn]CMD:agiveall(playerid, params[]) {
   new sta[15],kolicina,str[90];
   if(sscanf(params, "s[15]i",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] [kolicina]");
   if(strcmp(sta, "monusd", true) == 0)
   {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [monusd] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
       format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
      }
     }
     if(strcmp(sta, "moneuro", true) == 0)
    {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [moneuro] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
          format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
      }
   }
     return 1;
}[/pawn]
EDIT - obojao za sta & velicinu sta - da skontas bolje / da razumijes bolje
Poslednja Izmena: Avgust 11, 2018, 01:22:24 PRE PODNE od youngdeal
69

Citat: youngdeal poslato Avgust 11, 2018, 01:20:31 PRE PODNE
evo ti nesto lakse na moj nacin / preradjena komanda,nemam vremena da ti ispravljam tvoju trenutno zurim idem negdje pa sam ti zacas ispisao na moj nacin / preradio komandu, uglavnom stavio sam velicinu sta 15 da mozes stavit moneyusd ili moneyeuro ili money-usd ili money-euro,ja sam stavio monusd i moneuro, mozes izmijenit kako zelis
[pawn]CMD:agiveall(playerid, params[]) {
   new sta[15],kolicina,str[90];
   if(sscanf(params, "s[15]i",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] [kolicina]");
   if(strcmp(sta, "monusd", true) == 0)
   {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [monusd] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
       format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
      }
     }
     if(strcmp(sta, "moneuro", true) == 0)
    {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [moneuro] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
          format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
      }
   }
     return 1;
}[/pawn]
EDIT - obojao za sta & velicinu sta - da skontas bolje / da razumijes bolje
Komanda je ok ali testiraj je i probaj da ukucas /agiveall monusd 99999999 ili /agiveall monusd 999999999
Tada nastaje problem.
Zanima me da li to mooze nekako da se resi, niko nece davati tolike pare ali ako se nadje neka budala da proba, server krene da bode i baca errore i warninge