2017-03-07 1 views
-1

Also habe ich eine Frage über Flags und Argumente in C von Argv-Array. Wenn ich geben Sie einen commant durch Terminal: Beispiel: ./main a b c -a es nicht, dass -a am Ende erkennt, aber wenn ich es am Anfang aller Argumente wie: ./main -a a b c wird es erkennen.Flag Reihenfolge in C

Ich versuchte es zu tauschen, wenn ja, es wäre in der Front aller argumetns, aber nach einem Tausch geht es nicht weiter. So etwas wie das Ignorieren der for-Schleife danach. Also tauscht es einfach und beendet dann den Fall. Wenn jemand weiß, was ich hier vermisse, wäre ich glücklich.

Code:

while ((c = getopt(argc, argv, ":ahd:")) != -1) { 
    switch (c) { 
     case 'a': 
      if(strcmp(argv[argc-1], "-a") == 0){ 
       swap(&argv[argc-1], &argv[1]); 
      } 
      for(i = optind; i < argc; i++){ 
       for(j = optind; j < argc - 1; j++){ 
        if(strcmp(argv[j], argv[j + 1]) > 0){ 
         swap(&argv[j], &argv[j + 1]); 
        } 
       } 
      } 

      for(z = optind; z < argc; z++){ 
       printf("%s\n", argv[z]); 
      } 
      printf("%s\n", argv[1]); 
      break; 
+3

Sie Ihren Code in der Frage fehlt, so können wir sehen, was Sie falsch machen? :) –

+1

Was ist das "es", auf das du dich beziehst, wenn du sagst "Es erkennt nicht ..."? – rici

+0

Das Problem liegt nicht darin, ob die Programmargumente im 'argv'-Array erscheinen - sie alle tun dies in der Reihenfolge ihres Auftretens in der Befehlszeile - sondern vielmehr, was Ihr Programm mit ihnen macht. Wir können nicht mit dem sprechen, was Ihr Programm tut, wenn Sie nichts vom Programm präsentiert haben. Wenn Sie Hilfe mit Code benötigen, erwarten wir normalerweise, dass [mcve] Ihr Problem demonstriert. –

Antwort

0

Die GNU-Version von getopt() für Permutation der Argumente ermöglicht, so dass alle -a Stil-Optionen (die vor einer -- Option erscheinen) verarbeitet werden, auch wenn es nicht-Option Argumente vor Sie.

some_program -z abc def -b -- -w warning 

Die -z und -b Optionen würden von GNU getopt(), werden erkannt, aber die -w wäre ein nicht-Optionsargument sein.

Die POSIX-Version von getopt() lässt dies nicht zu; viele Nicht-GNU-Implementierungen von getopt() tun dies nicht. GNU weiß, dass das, was sie tun, eine Erweiterung ist; Das Permutierverhalten kann durch Setzen von POSIXLY_CORRECT in der Umgebung ausgeschaltet werden.

Wenn Sie möchten, dass Optionen überall erkannt werden, verwenden Sie die GNU getopt() in Ihrem Programm. Wenn Sie das lokale getopt() verwenden möchten, um portabel zu bleiben, oder GPL-Code in Ihren Programmen nicht verwenden können, entwerfen Sie Ihr System so, dass Optionen vor Argumente ohne Optionen gesetzt werden. Beachten Sie, dass Programme wie make und die C-Compiler bereits über angepasste Argumentverarbeitungssysteme verfügen, die das Interleaving von Optionen und Nicht-Optionsargumenten ermöglichen. Sie sollten jedoch die POSIX-Codierungsrichtlinien (Utility Conventions) befolgen, außer Sie haben einen starken Grund, etwas anderes zu tun.

0

Ok ich es behoben haben durch Änderung wenn Satz

if(strcmp(argv[optind-1], "-a") == 0){ 
      swap(&argv[optind-1], &argv[1]); 
     }