argv überprüfen
-
Ich habe ein kleines Programm geschrieben, das die Kommandozeilen-Argumente auswertet und anzeigt.
Es soll der Unterbau für ein kleines Sortier-Programm werden.
#include <stdio.h> #include <string.h> #define DATEINAMEN_LAENGE 31 void argumentAnalyse(int argc, char *argv[], int *sortierung, char eingabeDatei[], char ausgabeDatei[], char statistik[], int *hilfe); int main(int argc, char *argv[]) { int sortierung = -1, hilfe = 0; char eingabeDatei[DATEINAMEN_LAENGE] = "stdin"; char ausgabeDatei[DATEINAMEN_LAENGE] = "stdout"; char statistik[DATEINAMEN_LAENGE] = "stderr"; argumentAnalyse(argc, argv, &sortierung, eingabeDatei, ausgabeDatei, statistik, &hilfe); if(hilfe == 1) { puts("filesort [-a|-d] [-i input] [-o output] [-s [statistic]]\n" "-a...aufsteigend (default)\n" "-d...absteigend\n" "-i Eingabedatei (default: Standardeingabe)\n" "-o Ausgabedatei (default: Standardausgabe)\n" "-s Statistikdatei (default: Standardfehler)\n" "-? dieser Hilfstext"); } else { printf("Sortierung: %s\n", (sortierung == -1) ? "aufsteigend":"absteigend"); printf("Eingabe: %s\n", strcmp(eingabeDatei, "stdin") ? eingabeDatei:"Standardeingabe"); printf("Ausgabe: %s\n", strcmp(ausgabeDatei, "stdout") ? ausgabeDatei:"Standardausgabe"); printf("Statistik: %s\n\n", strcmp(statistik, "stderr") ? statistik:"Standardfehlerausgabe"); } return 0; } void argumentAnalyse(int argc, char *argv[], int *sortierung, char eingabeDatei[], char ausgabeDatei[], char statistik[], int *hilfe) { if(!strcmp(argv[1], "-?") || argc == 1) { *hilfe = 1; } else { for(int i=0; i < argc; i++) { if(!strcmp(argv[i], "-d")) /* "-d" = absteigende Sortierung: Z - A */ *sortierung = 1; else if(!strcmp(argv[i], "-a")) /* "-a" = aufsteigende Sortierung (Standard): A - Z */ *sortierung = -1; else if(!strcmp(argv[i], "-i")) { if(argv[i+1] != NULL) /* Wenn kein Argument mehr folgt, Hilfe ausgeben. (Syntax-Fehler) */ strcpy(eingabeDatei, argv[i+1]); else *hilfe=1; } else if(!strcmp(argv[i], "-o")) { if(argv[i+1] != NULL) /* Wenn kein Argument mehr folgt, Hilfe ausgeben. (Syntax-Fehler) */ strcpy(ausgabeDatei, argv[i+1]); else *hilfe=1; } else if(!strcmp(argv[i], "-s")) { if(argv[i+1] != NULL) /* Wenn kein Argument mehr folgt, Statstik = stderr */ strcpy(statistik, argv[i+1]); } } } }
Irgendwie kommt mir das alles aber sehr umständlich vor, hat jemand eine Idee wie man es leichter bzw. besser realisieren könnte? Wenn ich es außerdem ohne Argumente aufrufe, kommt eine Fehlermeldung...
-
Hallo,
der Fehler den du bekommst, wenn du ohne Argumente aufrufst, liegt darin begründet dass du in deiner Funktion
void argumentAnalyse(int argc, char *argv[], int *sortierung, char eingabeDatei[], char ausgabeDatei[], char statistik[], int *hilfe)
nicht überprüfst ob überhaupt Argumente vorhanden sind.
Du darfst deinen Code nur ausführen wenn dein argc größer als eins ist.Recht vereinfachen kannst du das meiner Meinung nach nicht. Wenn du C++ auch verwenden kannst würde ich mal in der Boost Bibliothek schauen. Die haben glaube ich irgendwas zum verarbeiten von Kommandozeilenparametern.
Gruss
Tobi
-
if(argc > 1) argumentAnalyse(argc, argv, &sortierung, eingabeDatei, ausgabeDatei, statistik, &hilfe); else hilfe = 1;
Danke, jetzt funktioniert schon mal der Aufruf ohne Argumente auch!