Problem sa sscanf

Započeo .Drakula.
9. Avg. 2018.
1,604
pregleda
17
postova
Dragan_Milosavljevic
4
Shot Caller
9. Avg. 2018.
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, "si", 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:

      new akcija;
      if(sscanf(params, "s", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
{
    new kolicina, nacin, str;
if(sscanf(params, "si", 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);
        }
    }
}

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): //
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
Postavi
new akcija[6+5];
bc-cod2
3
Hustler
10. Avg. 2018.
if(sscanf(params, "ssi", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
SejnurHD
5
OG Legend
10. Avg. 2018.
buLLeT_ wrote on August 10, 2018, 8:31 am:
if(sscanf(params, "ssi", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Cemu ovo? Bukvalno si iskopirao kod koji je Dragan_Milosavljevic poslao.
Dragan_Milosavljevic
4
Shot Caller
10. Avg. 2018.
Nije isto kod.

Moj:
if(sscanf(params, "si", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "ssi", 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.
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
Dragan_Milosavljevic wrote on August 10, 2018, 12:17 pm:
Nije isto kod.

Moj:
if(sscanf(params, "si", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "ssi", 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
Dragan_Milosavljevic
4
Shot Caller
10. Avg. 2018.
ᴢɪᴠᴋᴏᴠɪᴄ wrote on August 10, 2018, 1:56 pm:
Je si li uradio ovo sto ti rekoh? Probaj staviti vrednost akcije vece od same nje

Uradio sam ovako:
new akcija;
      if(sscanf(params, "s", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
{
    new kolicina, nacin, str;
if(sscanf(params, "ssi", 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);
        }
    }
}

Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");

To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
if(sscanf(params, "ssi", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
sscanf warning: String buffer overflow.
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
Dragan_Milosavljevic wrote on August 10, 2018, 2:20 pm:
Uradio sam ovako:
new akcija;
      if(sscanf(params, "s", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
{
    new kolicina, nacin, str;
if(sscanf(params, "ssi", 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);
        }
    }
}

Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");

To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
if(sscanf(params, "ssi", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
sscanf warning: String buffer overflow.

lool zasto u parametru %i a ne %d? stavi %d pa mi reci sta kaze
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
PS: moja greska
mislio sam na ' "ssi" ' da stavis ovako ' "ssd" '
Dragan_Milosavljevic
4
Shot Caller
10. Avg. 2018.
ᴢɪᴠᴋᴏᴠɪᴄ wrote on August 10, 2018, 2:28 pm:
PS: moja greska
mislio sam na ' "ssi" ' da stavis ovako ' "ssd" '

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
Desi se isto kao gore sto sam ti obijasnio.
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
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
Dzoni Zivkovic
5
Underboss
10. Avg. 2018.
jer sam ja na fonu sad pa cu kada budem PC proveriti kod
Dragan_Milosavljevic
4
Shot Caller
10. Avg. 2018.
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.?
James_SmithXDl
6
OG Legend
10. Avg. 2018.
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
CMD:agiveall(playerid, params[]) {
new sta,kolicina,str;
if(sscanf(params, "si",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] ");
if(strcmp(sta, "monusd", true) == 0)
{
if(sscanf(params, "si", sta, kolicina)) return Cmd(playerid, "/agiveall ");
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, "si", sta, kolicina)) return Cmd(playerid, "/agiveall ");
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;
}

EDIT - obojao za sta & velicinu sta - da skontas bolje / da razumijes bolje
Dragan_Milosavljevic
4
Shot Caller
11. Avg. 2018.
youngdeal wrote on August 10, 2018, 11:20 pm:
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
CMD:agiveall(playerid, params[]) {
new sta,kolicina,str;
if(sscanf(params, "si",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] ");
if(strcmp(sta, "monusd", true) == 0)
{
if(sscanf(params, "si", sta, kolicina)) return Cmd(playerid, "/agiveall ");
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, "si", sta, kolicina)) return Cmd(playerid, "/agiveall ");
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;
}

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

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava

© 2026 SmartShark. All rights reserved.

Powered by Momentum|v2026.3.001 Alpha