2016-03-24 14 views
-2

Ich bin neu in der Programmierung und dieser hat mich verblüfft.Befehlszeilenargumente mit if/else-Anweisungen in C

Ich schreibe eine Funktion, die von main aufgerufen wird, die die Befehlszeilenargumente übernimmt und sie in einem struct speichert, um später zu verwenden. Dieses spezielle Beispiel dient zur Bildbearbeitung, kann aber überall verwendet werden.

Gewünschte Leistung: Die Funktion übernimmt Argumente von der Befehlszeile. Drei spezifische Argumente werden identifiziert und überprüft auf: -h, -o und -t. Wenn vorhanden, werden sie die struct Werte ändern. Die Argumente -o und -t speichern die Argumente, die ihnen unmittelbar folgen, in ihre entsprechenden Felder struct. Jedes Argument, das nicht -h ist oder -o oder -t nicht vorausgeht, wird als Name der Eingabedatei angenommen und in flag->inputFile gespeichert. Wenn alle Argumente berücksichtigt werden, sollte flag->inputFileNULL bleiben und kann in der Hauptfunktion getestet werden und Programm beendet werden, wenn dies wahr ist.

Problem: Wenn es keine Eingabedatei (unter Verwendung des oben genannten Parameters) angegeben ist flag->inputFile hält auf -o gesetzt wird, wenn es als Argument enthalten ist.

Lösung: Dank Scott diese Frage durch das Ersetzen mehr if Aussagen mit else if beantwortet wurde nun schien das Problem zu beheben, und die Funktion erscheint, wie gewünscht zu arbeiten. Mein Verständnis von dem, was passiert ist, dass die else Anweisung in jeder Iteration von i ausgeführt wurde, es sei denn das -t Argument enthalten war, da er die Aussage unmittelbar vor dem else

war der Compiler ich benutze ist gcc und diese ist mein Code. (Ich weiß, dass meine Struktur nicht gepackt ist, ich versuche immer noch, meinen Kopf herumzukriegen und kann nicht sehen, wie es dazu führen würde, was ich sehe. Segmentierungsfehler, ja, aber nicht das?)

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

struct PROMPTFLAGS { 
    int help; // Change from NULL if -h argument present 
    char * outputFile; // Store argument after -o as the output file 
    char * inputFile; // Argument not paired with a flag stored here as input file 
    float threshold; // Stores a value to use in image manipulation in main 
}; 

struct PROMPTFLAGS * parsargs(int argc, char * argv[]) { 
    struct PROMPTFLAGS* flag = malloc(sizeof(struct PROMPTFLAGS)); 
    int i; 
    printf("argc: %d\n",argc); 
    for (i = 1; i < argc; i++) { 
     char * arg = argv[i]; 
     int str_aft = i+1; // Allows the next string to be used in this iteration of the loop 
     if (strcmp(arg,"-h") == 0) { 
      flag->help = 1; 
     } 
     if (strcmp(arg,"-o") == 0) { // Changing this to 'else if' seems to be a fix 
      flag->outputFile = argv[str_aft]; 
      i++;  // Skips over next arg since already read by argv[str_aft] 
     } 
     if (strcmp(arg,"-t") == 0) { // Changing this to 'else if' seems to be a fix 
      flag->threshold = strtod(argv[str_aft],NULL); 
      i++;  // Skips over next arg since already read by argv[str_aft] 
     } 
     else { 
      flag->inputFile = arg; 
     } 
    } 
    return flag; 
} 

int main(int argc, char* argv[]) { 

    struct PROMPTFLAGS * flags; 
    flags = parsargs(argc, argv); 
    printf("Help = %d\n",flags.help); 
    printf("Output = %s\n",flags.outputFile); 
    printf("Input = %s\n",flags.inputFile); 
    printf("Threshold = %s\n",flags.threshold); 

return 0; 
} 

Ich entschuldige mich für das schlechte Format der ersten Version dieser Frage und hoffe, dass diese Bearbeitung besser ist. Ich habe die gewünschten Ergebnisse der Funktionen gemacht und das Problem, dem ich begegnete, klarer und entfernte die meisten der Testdrucke, die ich durch den Code hatte, und fügte einige Kommentare hinzu. Ich habe auch die Lösung für mein Problem (von einem anderen Benutzer bereitgestellt) und mein Verständnis von dem, was im gebrochenen Code passiert ist, aufgenommen.

Wenn die Leute immer noch denken, das ist eine schlechte Frage oder nutzlos für irgendjemand anderen, dann bin ich froh, es zu nehmen, aber habe es bearbeitet und es in der Hoffnung verlassen, dass es jemand anderem helfen kann.

Dies ist meine erste Post auf Stack-Overflow und ich danke allen für ihre Hilfe und Geduld, während ich lernen, Code und die beste Art und Weise zu Fragen zu posten.

+1

Wenn Sie dies noch nicht getan haben, sollten Sie jetzt lernen, wie Sie einen Debugger verwenden. Mit ihm können Sie Zeile für Zeile durch den Code gehen und dabei die Variablen und ihre Werte überwachen. Der Debugger und das Wissen darüber, wie man ihn benutzt, ist ein wesentlicher Bestandteil der Programmierung. –

+0

Zero fill '* flag' nach dem Zuweisen. – chux

+0

@JoachimPileborg Danke für diesen Vorschlag, ich werde jetzt etwas Zeit mit einem Debugger verbringen und sehen, was ich bekomme. – GrassHopper

Antwort

1

Sie setzen flag->inputFile = arg, wenn arg nicht "-t" ist (die else nach für "-t" Prüfung). Ich bin mir nicht sicher, wann Sie dieses Feld zuweisen möchten, aber ich bin mir sicher, dass dies nicht die richtige Logik dafür ist. Zum Beispiel, wenn Sie dies tun wollten, wenn arg keiner der anderen spezifischen Flags ist, die Sie suchen, sollten Sie if ... else if ... else if ... else verwenden.

+2

Ja, und das OP sollte dieses Verhalten gesehen haben, wenn es unter seinem Debugger läuft :( –

+0

Danke! Scheint so offensichtlich jetzt .....: / – GrassHopper

Verwandte Themen