Parameter



  • Hi Leute, ich hab da mal ne Frage, und zwar habe ich ein Programm, welches auf bestimmte Befehle und ihre Parameter wartet:

    scanf("%s%s%s", command, para1, para2);
    

    So nun ist es aber so, dass nicht jeder Befehl immer 2 Parameter braucht, sondern manchmal nur einen oder auch garkeinen. scanf() verlangt aber immer 3 Eingaben, bzw. den Befehl und 2 Parameter.
    Wie kann ich es also anstellen, dass man nicht immer noch 2 weitere Eingaben machen muss? Halt ein bisschen wie

    int argc, char *argv[]
    

    .

    Thx fuer Hilfe 🙂 .



  • Lass doch den Benutzer eine Zeile eingeben in der form

    command, para1, para2
    addiere,53.4, 129.3
    Hol die Zeile mit gets

    dann hol das Kommando aus dem String (strstr,strcpy), damit weist du wieviel Paramter du brauchst und hole diese dann ebenfalls

    es könnte sogar mit

    Anzahl=sscanf(buffer,"%s%s%s", command, para1, para2);
    

    funktioniern da sscanf die anzahl der gewandelten items angibt. Ich persönlich würde es nicht so machen da ich von ..scanf.. nicht sehr viel halte.



  • Danke erstmal, aber es sollte schon mit command para1 para2.... gehen!
    Am besten waer, wenn mir einer mal zeigen koennte, wie ich eine Zeile am besten parse.
    Ich hab davon keine Ahnung, sorry.
    Habs auch schon mit strtok probiert, ging alles in die Hose 😞 .



  • XFame schrieb:

    Wie kann ich es also anstellen, dass man nicht immer noch 2 weitere Eingaben machen muss?

    Ich weis es jetzt nicht unbedingt ob es eine prinzipfrage war, oder nur die Lösung für dieses Problem.

    Wenns ums dieses Problem geht, dann würde ich erstmal nur denn command holen:

    scanf("%s", &command);
    

    Auswerten:

    if(strcmp(command, "meincomand1\n") == 0){
            scanf("%s %s", &para1, &para2);  /* Zwei para erforderlich */
    }
    else if(strcmp(command, "meincomand2\n") == 0){
            scanf("%s", &para1);              /* ein para erforderlich */
    }
    

    PAD schrieb:

    Hol die Zeile mit gets

    Die von PAD beschriebene Vorgehensweis ist sehr gut, jedoch würde ich statt gets() lieber fgets() nutzen. gets() ist berüchtigt für Angreifer. Stichwort: Stack-bufferoverflow

    gruss 🙂



  • Wenn ich das richtig interpretiere trennt ein Leerzeichen Kommando und parameer bzw parameter con parameter

    substr findest du hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-113655-and-highlight-is-substr.html

    typedef struct {
        char *item;
        UINT32 codon;
    
    }
    replaceItems;
    
    #define ADD 1
    #define SUB 2
    
    replaceItems Kommandos[]={   {addiere,ADD},
                                 {subtrahiere,SUB}
                             };
    int AnzKommandos=sizeof(Kommandos)/sizeof(replaceItems));
    /***********************************************************************.FA*
     .FUNCTION [ GetNameNum                                     ]
    --------------------------------------------------------------------------
     .DESCRIPTION
      Purpose:     get's an entry from an lookup table
                   the lookuptable test is searched for the item
                   pcPar and the according Integernumber 'codon' is returned
    --------------------------------------------------------------------------
     .PARAMETER
      Parameters:
      IN   char *pcpar           Item to be decoded
           replaceItems test[]   Lookuptable
           int f                 Length of lookuptable
    --------------------------------------------------------------------------
     .RETURNVALUE
     .RÜCKGABEWERT
     Return values:    -1   not found
                       the number of the string otherwise
    --------------------------------------------------------------------------
     .HISTORY
      Date      Author            Comment
      09.05.94  PAD /DDT        comments adapted for SOFTDOC
    **********************************************************************.HE**/
    INT32 _ETZ_FUNCS  GetNameNum(char *pcPar,replaceItems test[], int f)
    {
        int i;
        for (i=0;i < f;i++)
        {
            if (0==stricmp(pcPar,test[i].item))
                return test[i].codon;
        }
        return -1;
    }
    
    // Code Ausriss ungetestet .......
    char Buffer0[256+1];
    char Command[256+1];
    int wert;
    
    gets(Buffer0);
    substr(Buffer0,Buffer1,' ');
    wert=GetNameNum(Buffer1,Kommandos,AnzKommandos);
    switch(wert)
    {
     case ADD:  // Als Beispiel hat nur einen parameter der ist in Buffer0
     //.... Hier irgend eine sinnvolle Aktion mit den Parametern
     break;
     case SUB:  // Als Beispiel hat zwei parameter para1 ist in Buffer1, para2 in buffer0
        substr(Buffer0,Buffer1,' ');
        if(0==strlen(Buffer0);
                printf("Error: Parameter missing\n");
       //.... Hier irgend eine sinnvolle Aktion mit den Parametern
     break;
     default:
     printf("Error: unknown Command\n");
    }
    ....
    


  • Ah danke schonmal, ich werds mal probieren, hab aber noch eine Frage:
    Ich habe ein char Array, das cbuf heisst.
    nun mache ich eine Abfrage:

    if(cbuf[0] == "e"){}
    

    funktioniert nicht.
    Warum funktioniert nur:

    if(cbuf[0] == 101){}
    

    ?



  • weil du einen Schreibfehler machst
    "e" '"' bezeichnet eine String der Form e\0
    du must schreiben
    'e' ''' bzeichnet die ASCII-Darstellung eines Buschstabens



  • Ich bekomm es einfach nicht hin 😞 .
    Also an dieser stelle im code:

    scanf("%s%s%s", command, para1, para2);
    

    braeuchte ich was besseres.



  • woher soll er denn wissen das der string zu ende ist wenn du ihm keinen delimiter gibst.

    Restliche Antworten siehe oben


Anmelden zum Antworten