Problem mit getopt bzw. optarg
-
Hallo zusammen,
ich soll ein Programm welches die Kommandozeilenparameter mittels getopt einließt so abändern, dass mehrzeilige Kommandos die sich in einer Datei befinden eingelesen werden können. Hierbei sollen die kommandos jeweils Zeilenweise ausgeführt werden. Jede Zeile entspricht somit einer iteration des Programms.
Diesbzgl. Habe ich ein kleines Problem mit optarg. Am besten jedoch ich poste erstmal den Quellcode:#include "stdlib.h" #include "stdio.h" #define LINESIZE 256 char string[256]; char *line=0; extern char* optarg; int c=0, counter=0; int i=1; int j=0; int main(int argc,char* argv[]) { FILE *pt=0; pt=fopen(argv[1],"rw"); if(pt!=NULL){ while (fgets(string,LINESIZE,pt) != 0){ printf("Die Zeile ist: %s\n",string); i=1; //Reinitialisierung j=0; //Reinitialisierung c=0; //Reinitialisierung line=strtok(string," "); if(line){ argv[i]=line; i++; while((line=strtok(NULL," "))){ argv[i]=line; i++; argc=i; } for(j;j<i;j++){ /*printf("Dies ist Parameter nummer %d: %s\n",j,argv[j]);*/ } } } while((c = getopt(argc,argv,"a:b:c:d:e")) != -1) { switch (c) { case 'a' : printf("Dies ist ein a, OPTARG = %s\n",optarg); break; case 'b' : printf("Dies ist ein b, OPTARG = %s\n",optarg); break; case 'c' : printf("Dies ist ein c, OPTARG = %s\n",optarg); break; case 'd' : printf("Dies ist ein d, OPTARG = %s\n",optarg); break; case 'e' : printf("Dies ist ein e, OPTARG = %s\n",optarg); break; } }
Bei einzeiligen Dateien ist dies auch kein Problem. Eine Datei die die folgende Zeile enthält führt nun zu folgendem Ergebnis:
Die Zeile ist: -aDies -aIst -cEin -dTest
Dies ist ein a, OPTARG = Dies
Dies ist ein a, OPTARG = Ist
Dies ist ein c, OPTARG = Ein
Dies ist ein d, OPTARG = TestSobald ich jedoch noch eine Zeile anhänge resultiert folgendes:
Die Zeile ist: -aDies -aIst -cEin -dTest
Die Zeile ist: -eUND -eDIES -eAUCHDies ist ein e, OPTARG = (null)
a.out: illegal option -- U
a.out: illegal option -- N
a.out: illegal option -- D
Dies ist ein e, OPTARG = (null)
a.out: illegal option -- D
a.out: illegal option -- I
a.out: illegal option -- E
a.out: illegal option -- S
Dies ist ein e, OPTARG = (null)
a.out: illegal option -- A
a.out: illegal option -- U
a.out: illegal option -- C
a.out: illegal option -- HDas Problem ist also, das optarg nicht das jeweilige Argument enthält, sondern lediglich (null). Ich kann mir leider nicht erklären woran das liegt.
Nun noch einige Anmerkungen. Mir ist bewusst, dass das Programm in dieser Form immer nur die letzte Zeile der Datei auswertet, was aber im Moment für meine Zwecke erstmal ausreicht. Weiterhin bin ich mir nicht richtig sicher ob Probleme bzgl. getopt überhaupt ins ANSI C Forum gehören, aber ich dachte mir wenns jmd. weiß, dann die Leute aus diesem Forum.
So, vielen Dank schonmal im Voraus für die Lösungsvorschläge
-
du hast hinter e das : vergessen somit ist ein Schalter ohne paramter. Da man bei getopt mehrere SchaltOptionen ohne weiteres - anreihen kann hat er bei deiner zweiten Zeile das folgende vbersucht
-eUND -eDIES -eAUCH
-e -U -N -D -e ... und so weitergetopt kennt zwei arten von Kommadozeilenparameteren
- Schalter diese werden bei getopt ohne : angegeben
- Paramter mit Daten die werden in getopt mit einem : gekennzeichnet