1 Scanf auslesen und in der auswahl ein 2. mal mit sscanf auslesen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo Community


    Ich möchte gerne den Befehl /medis [Medikamente, Spritzen, Show] [Anzahl] machen


    so nun benötige ich die Anzahl aber nur bei Medikamente und Spritzen


    Also dachte ich mir wenn das Medikamente ausgelesen ist lass ihn nochmal auslesen
    das brachte diesen Code zustande


    ocmd:medis(playerid, params[])
    {
    if(IstInFraktion(playerid) != FRAK_Medic) { return SendInfoMsg(playerid, "Du bist kein Medic!"); }
    if(Duty[playerid] != 2) return SendInfoMsg(playerid, "Du bist nicht im Dienst! (/duty)");
    new Auswahl[11],Anzahl,tmpstr[128];
    if(sscanf(params,"s",Auswahl)) {
    SendNutzMsg(playerid, "/medis [Medikamente/Spritzen/Show]");
    return 1;
    }
    if(!strcmp(Auswahl, "medikamente", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    if(sscanf(Auswahl,"si",Auswahl,Anzahl)) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");
    new MediAnzahl = SpielerVariablen[playerid][Medikamente]+Anzahl;
    if(MediAnzahl > 1200) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Medikamente mitnehmen! (Höchstens 1200)",1200-SpielerVariablen[playerid][Medikamente]);
    }
    new MediPreis = Anzahl*3;
    if(Spieler[playerid][Geld] > MediPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Medikament 3$)", MediPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Medikamente] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Medikamente für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,MediPreis,SpielerVariablen[playerid][Medikamente]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }
    }


    Nur kommt jetzt bei ausführung "Unkown Command"
    Bitte um Rat zur später Stund =)

    ik bin der vito c:

  • Debuggen hätte dir ganz schnell gezeigt wo der Fehler liegt.
    Ich vermute mal,dass in der Variable Auswahl nicht nur das Wort "Medikamten" steckt,sondern auch die Zahl ( Also: "Medikamente 10" ). Dadurch klappt deine Abfrage nicht und du beendest den Befehl. Allerdings gibt es kein Rückgabewert,der Standardmäßig zurückgegeben wird bei dir. Dazu müsstest du zwischen Zeile 27 und 28 noch ein return 1; einfügen ( Eventuell auch 0 , nutze kein ocmd ) .


    printf("Auswahl: '%s'",Auswahl);
    if(!strcmp(Auswahl, "medikamente", true)) {
    Prüf' das mal nach und poste doch auch direkt was dir ausgegeben wird.


    Angenommen es liegt daran,dann würde ich direkt bei der ersten SSCANF Nutzung auch direkt die Zahl mit auslesen. Allerdings ist es keine optimale Lösung,je nachdem ob du den Befehl später auch noch umformst.
    Für den Fall du nutzt SSCANF V2 ( Plugin ) , dann könntest du sscanf so anwenden:
    sscanf( inputtext , "s[11]D(0)",Auswahl,Anzahl);

  • Also das war schonmal ein guter Ansatz =) Danke Goldkiller


    jetzt habe ich den Code
    if(sscanf(params , "s[11]D(0)",Auswahl,Anzahl)) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");


    Klar standart = 0


    Also wenn ich "/medis medikamente" eingebe kommt keine Hilfe sondern er will sich 0 Medikamente kaufen xD
    Dan hab ich den standart wert weggenommen also
    if(sscanf(params , "s[11]d",Auswahl,Anzahl)) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");


    und dann kam wieder nur die Hilfe und man konnte nichts kaufen :huh:

    ik bin der vito c:

  • Auch wenn ds Offtopic ist.
    OCMD ist nicht case sensitive!
    Ihr benutz nur die 1.0 Version und nicht die 2.0!


    MFG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Dir sollte doch wohl klar sein,dass die Anzahl 0 Quatsch ist und somit ungültig. Du kannst natürlich auch -1 verwenden oder sonst etwas. Ich würde aber 0 bzw irgendetwas negatives verwenden.
    Da ich wie gesagt 0 verwenden würde, reicht eine Abfrage der Variable Anzahl kleiner/gleich 0. Ist dies dann dann der Fall,dann solltest du die Verarbeitung abbrechen und lediglich die Informationsnachricht versenden.


    if(sscanf(Auswahl,"si",Auswahl,Anzahl)) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");
    Diese Zeile müsstest du gegen die Abfrage von Anzahl austauschen,die ich zuvor erklärt hatte.

  • Genau ich hab sie in


    if(sscanf(params , "s[11]D(0)",Auswahl,Anzahl)) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");


    geändert


    wenn ich nichts eingebe nimmt er 0
    Wenn ich aber 10 dahinter eingebe kommt wieder eine Hilfe moment hier der ganze Befehl:
    http://pastebin.de/28963



    nur kommt jetzt bei der Eingabe von /medis Medikamente 10
    die untere Hilfe Meldung... also die


    else {
    SendNutzMsg(playerid, "/medis [Medikamente/Spritzen/Show]");
    return 1;
    }

    ik bin der vito c:

  • Okay, zwei Sachen die sofort auffalen.


    Es gibt auch sowas:
    if() // EntwederA
    else if() // Oder Entweder B
    else if() // Oder aber Entweder C
    else // Sonst
    Die Verwendung von sscanf innerhalb der if() Abfrage bringt absolut nichts und führt nur zu Fehlern.
    Ließ meinen Post nochmal. Du solltest in der ersten Nutzung von sscanf die Parameter auslesen, auch für die Anzahl. Sonst ist es teilweise doppelte Arbeit bei dir.

  • Also hab hier mal ausgeben lassen



    printf("Auswahl: %s", Auswahl);
    if(!strcmp(Auswahl, "medikamente", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    sscanf(params , "s[11]D(0)",Auswahl,Anzahl);
    if(Anzahl <= 0) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");
    printf("Auswahl: %s | Anzahl", Auswahl, Anzahl);
    new MediAnzahl = SpielerVariablen[playerid][Medikamente]+Anzahl;
    if(MediAnzahl > 1200) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Medikamente mitnehmen! (Höchstens 1200)",1200-SpielerVariablen[playerid][Medikamente]);
    }
    new MediPreis = Anzahl*3;
    if(Spieler[playerid][Geld] < MediPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Medikament 3$)", MediPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Medikamente] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Medikamente für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,MediPreis,SpielerVariablen[playerid][Medikamente]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }


    bei
    ./medis Medikamente
    kommt

    Code
    [00:17:06] sscanf warning: Strings without a length are deprecated, please add a destination size.
    [00:17:06] Auswahl: Medikamente
    [00:17:06] sscanf warning: String buffer overflow.


    bei
    ./medi Medikamente 10
    kommt

    Code
    [00:17:19] sscanf warning: Strings without a length are deprecated, please add a destination size.
    [00:17:19] Auswahl: Medikamente 10


    Ich verstehs nicht xD


    1. Wieso diese Warnings?
    2. wieso geht er ohne Zahl da rein und mit nicht? :D

    ik bin der vito c:

  • Ja ich hab nochnie mit sscanf 2 gearbeitet :D
    Wie muss ich es denn verändern das es geht?


    ocmd:medis(playerid, params[])
    {
    if(IstInFraktion(playerid) != FRAK_Medic) { return SendInfoMsg(playerid, "Du bist kein Medic!"); }
    if(Duty[playerid] != 2) return SendInfoMsg(playerid, "Du bist nicht im Dienst! (/duty)");
    new Auswahl[20],Anzahl,tmpstr[128];
    if(sscanf(params,"s",Auswahl)) {
    SendNutzMsg(playerid, "/medis [Medikamente/Spritzen]");
    return 1;
    }
    printf("Auswahl: %s", Auswahl);
    if(!strcmp(Auswahl, "medikamente", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    sscanf(params , "s[11]D(0)",Auswahl,Anzahl);
    if(Anzahl <= 0) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");
    printf("Auswahl: %s | Anzahl", Auswahl, Anzahl);
    new MediAnzahl = SpielerVariablen[playerid][Medikamente]+Anzahl;
    if(MediAnzahl > 1200) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Medikamente mitnehmen! (Höchstens 1200)",1200-SpielerVariablen[playerid][Medikamente]);
    }
    new MediPreis = Anzahl*3;
    if(Spieler[playerid][Geld] < MediPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Medikament 3$)", MediPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Medikamente] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Medikamente für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,MediPreis,SpielerVariablen[playerid][Medikamente]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }
    else if(!strcmp(Auswahl, "spritzen", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    sscanf(params , "s[8]D(0)",Auswahl,Anzahl);
    if(Anzahl <= 0) return SendNutzMsg(playerid, "/medis Spritzen [Anzahl]");
    new SpritzenAnzahl = SpielerVariablen[playerid][Spritzen]+Anzahl;
    if(SpritzenAnzahl >= 1000) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Spritzen mitnehmen! (Höchstens 1000)",1000-SpielerVariablen[playerid][Medikamente]);
    }
    new SpritzenPreis = Anzahl*4;
    if(Spieler[playerid][Geld] < SpritzenPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Spritzen 4$)", SpritzenPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Spritzen] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Spritzen für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,SpritzenPreis,SpielerVariablen[playerid][Spritzen]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }
    else if(!strcmp(Auswahl, "show", true)) {
    format(tmpstr, sizeof tmpstr, "Medikamente: %d/1200 \nSpritzen: %d/1000", SpielerVariablen[playerid][Medikamente],SpielerVariablen[playerid][Spritzen]);
    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Medikamente u. Spritzen:", tmpstr, "Ok", "");
    return 1;
    }
    else {
    SendNutzMsg(playerid, "/medis [Medikamente/Spritzen/Show]");
    return 1;
    }
    }

    ik bin der vito c:

  • Warum machst du es nicht mit einem Optionalen String, den du dann in einen Integer umwandelst?
    Das ist viel einfacher und funktioniert bei mir auch :)



    ocmd:medis(playerid, params[])
    {
    if(IstInFraktion(playerid) != FRAK_Medic) { return SendInfoMsg(playerid, "Du bist kein Medic!"); }
    if(Duty[playerid] != 2) return SendInfoMsg(playerid, "Du bist nicht im Dienst! (/duty)");
    new Auswahl[20],Anzahl2[5],tmpstr[128];
    if(sscanf(params,"sz",Auswahl,Anzahl2)) { SendNutzMsg(playerid, "/medis [Medikamente/Spritzen/Show] <Anzahl>"); return 1; }
    printf("Auswahl: %s", Auswahl);

    new Anzahl = strval(Anzahl2);


    if(!strcmp(Auswahl, "medikamente", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    if(Anzahl <= 0) return SendNutzMsg(playerid, "/medis Medikamente [Anzahl]");
    printf("Auswahl: %s | Anzahl", Auswahl, Anzahl);
    new MediAnzahl = SpielerVariablen[playerid][Medikamente]+Anzahl;
    if(MediAnzahl > 1200) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Medikamente mitnehmen! (Höchstens 1200)",1200-SpielerVariablen[playerid][Medikamente]);
    }
    new MediPreis = Anzahl*3;
    if(Spieler[playerid][Geld] < MediPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Medikament 3$)", MediPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Medikamente] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Medikamente für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,MediPreis,SpielerVariablen[playerid][Medikamente]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }
    else if(!strcmp(Auswahl, "spritzen", true)) {
    if(!IsPlayerInRangeOfPoint(playerid, 3.0,1418.4304,3.8823,1001.4976)) return SendInfoMsg(playerid, "Du bist nicht am Medikamenten Center!");
    if(Anzahl <= 0) return SendNutzMsg(playerid, "/medis Spritzen [Anzahl]");
    new SpritzenAnzahl = SpielerVariablen[playerid][Spritzen]+Anzahl;
    if(SpritzenAnzahl >= 1000) {
    format(tmpstr, sizeof tmpstr, "Du kannst nurnoch maximal %d Spritzen mitnehmen! (Höchstens 1000)",1000-SpielerVariablen[playerid][Medikamente]);
    }
    new SpritzenPreis = Anzahl*4;
    if(Spieler[playerid][Geld] < SpritzenPreis) {
    format(tmpstr, sizeof tmpstr, "Du hast nicht genug Geld! Du benötigst %d $ (Pro Spritzen 4$)", SpritzenPreis);
    SendInfoMsg(playerid, tmpstr);
    return 1;
    }
    SpielerVariablen[playerid][Spritzen] += Anzahl;
    format(tmpstr, sizeof tmpstr, "Du hast dir %d Spritzen für %d$ gekauft. Du hast nun %d Medikamente", Anzahl,SpritzenPreis,SpielerVariablen[playerid][Spritzen]);
    SendBlueMsg(playerid, tmpstr);
    return 1;
    }
    else if(!strcmp(Auswahl, "show", true)) {
    format(tmpstr, sizeof tmpstr, "Medikamente: %d/1200 \nSpritzen: %d/1000", SpielerVariablen[playerid][Medikamente],SpielerVariablen[playerid][Spritzen]);
    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Medikamente u. Spritzen:", tmpstr, "Ok", "");
    return 1;
    }
    else {
    SendNutzMsg(playerid, "/medis [Medikamente/Spritzen/Show]");
    return 1;
    }
    }