optionsargument in einer variable sichern



  • hallo alle zusammen, dies ist mein erster beitrag, hab auch
    im forum gesucht und nichts passendes gefunden ( oder auch
    nach falschen stichwörtern gesucht, aber da gibt es ja viele ),
    so, mein problem ist folgendes, meine anwendung schließt nicht sauber
    ab, hier erstmal der code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <unistd.h>    /* necessary for getopt */
    
    int main(int argc, char *argv[]){
    
        char input[100] = " -i ";
        int result = getopt(argc, argv, "i::f::o::");
    
        while (optind < argc)
          {
              if (result == -1) break; /* end of list */
              switch (result)
              {
                  case '?': /* unknown parameter */
                      break;
                  case ':': /* missing argument of a parameter */
                      fprintf(stderr, "missing argument.\n");
                      break;
                  case 'i':
                      printf("~ input-file <%s>\n",argv[optind++]);
                      strcat(input, argv[optind++]);
                      printf("%s",input);      
                      break;
                  case 'f':
                      printf("~ specified format is <%s>\n",argv[optind++]);
                      break;
                  case 'o':
                      printf("~ output-file <%s>\n",argv[optind++]);
                      break;
                  default: /* unknown */
                     break;
             }
          }
    
    }
    

    wenn die option -i sagen wir mit -i test.bin gesetzt ist sollte dann anschließend folgendes im bildschirm erscheinen :

    -i test.bin

    stattdessen jedoch stürtzt das komplette programm ab, ich verstehe nicht
    weshalb, hab auch ein wenig umgeschrieben etc. bin immer noch nicht weiter
    gekommen, eine genaue vermutung habe ich leider auch nicht woran es liegen
    könnte, ich weiß bloss das ich schon einmal so etwas ähnliches geschrieben
    habe, mit dem selben problem, doch den code habe ich nicht mehr, da lag
    es glaub ich an einem array, könnte es das hier auch sein? ( habs auch schon ausprobiert irgendwie an den arrays rumzuspielen, ist jedoch dabei geblieben,
    da habe ich nichts großartiges mehr gemacht )

    und bezüglich des rtfm, mein wissenstand würde ich so einschätzen, das ich mich in die meisten nicht in solchen c-von-a-bis-z-büchern aufgeführten funktionen erst einlese ( google oder msdn ) und dann ausprobiere bis es funktioniert. in diesem fall war es getopt, optionen kann es ja annehmen, die optionsargumente ebenfalls, jedoch scheiterts eben daran die argumente in/a einer variable abzusichern/anzuhängen.

    bedanke mich für eure denkanstöße schonmal im vorraus
    ( hoffentlich habe ich den passenden threadtitel gewählt... ).

    mfg,



  • Keine Ahnung ob du getopt() richtig verwendest, aber der Crash könnte z.B. durch die doppelte Inkrementierung von optind im case 'i' passieren.

    Muss man getopt() nicht immer in der Schleife neu aufrufen?

    edit: Die [cpp]-Tags sind viel schönder als [code]



  • vielen dank für deine antwort, auf die idee bin ich noch garnicht gekommen,
    ohne die inkrementierung funktioniert das ganze einwandfrei, vielen dank nochmal.
    und ja, da hast auch recht, getopt muss man in der schleife immer wieder neu aufrufen, sonst bekommt man ein ähnliches problem.



  • Die Codezeile

    result = getopt(argc, argv, "i::f::o::");
    

    wird nur einmal ausgefürt und sollte in jedem Schleifendurchgang ausgeführt werden.

    printf("~ input-file <%s>\n",argv[optind++]);
    strcat(input, argv[optind++]);
    

    hier inkrementierst du optind zweimal, obwohl nur einmal notwendig ist. Irgendwann hast du strcat(input, NULL) , weil der letzte Eintrag in argv ein NULL Pointer ist und dann kracht es.

    Hier ein Bsp aus der man page

    The following trivial example program uses getopt() to handle two program options: -n, with no associated
    value; and -t val, which expects an associated value.

    #include <unistd.h>
           #include <stdlib.h>
           #include <stdio.h>
    
           int
           main(int argc, char *argv[])
           {
               int flags, opt;
               int nsecs, tfnd;
    
               nsecs = 0;
               tfnd = 0;
               flags = 0;
               while ((opt = getopt(argc, argv, "nt:")) != -1) {
                   switch (opt) {
                   case 'n':
                       flags = 1;
                       break;
                   case 't':
                       nsecs = atoi(optarg);
                       tfnd = 1;
                       break;
                   default: /* '?' */
                       fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                               argv[0]);
                       exit(EXIT_FAILURE);
                   }
               }
    
               printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
    
               if (optind >= argc) {
                   fprintf(stderr, "Expected argument after options\n");
                   exit(EXIT_FAILURE);
               }
    
               printf("name argument = %s\n", argv[optind]);
    
               /* Other code omitted */
    
               exit(EXIT_SUCCESS);
           }
    

Anmelden zum Antworten