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 wieint 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 getsdann 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", ¶1, ¶2); /* Zwei para erforderlich */ } else if(strcmp(command, "meincomand2\n") == 0){ scanf("%s", ¶1); /* 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