2016-08-06 27 views
0

den folgenden Code vor:c optarg atoi ohne args

int number; 

while((w = getopt(argc, argv, "n:s:")) != -1) { 

     switch (w){ 

      case 'n': { 

       opfile->filename = optarg; 

      }break; 

      case 's': { 

       number = atoi(optarg); 

      }break; 

     } 
} 

Nun, wenn ich beide Optionen lassen oder die Option s leer, zum Beispiel ich mein Programm ohne Kommandozeile args beginnen, dann ist die number Variable erhält immer noch einen zufälligen Wert.

Was fehlt mir hier? Einige if-Anweisungen für den Fall s? Insbesondere möchte ich den Fall behandeln, in dem der Benutzer s in den Befehlszeilenargumenten keinen bestimmten Wert/keine spezifische Option zuweist.

Antwort

5

Wenn es keine Option, um das Programm übergeben ‚s‘, die case 's' Zweig haupt nicht ausgeführt wird, und nichts anderes setzt number auf einen Wert, was bedeutet, dass nachfolgende liest nicht definiertes Verhalten auslösen. (Dies ist möglicherweise viel schlimmer als nur geben Ihnen einen zufälligen Wert, wenn Sie von ihm später lesen. Es ist ein Muss-fix Bug.)

Aber weil nichts anderes number berührt, wird es genug sein

ändern
int number; 

zu

int number = 0; 

oder was auch immer Sie möchten, dass Ihr Verzug.

(Übrigens, sollten Sie wirklich stattdessen verwenden strtol von atoi, weil atoi Syntaxfehler ignoriert.)

+0

+1 Und es nur eine Notiz zu OP, die Tatsache, dass es nur ist eine Zufallsvariable geben macht Schwer zu wissen, dass ein Programm auf anderen Systemen (oder sogar auf dem gleichen System) abstürzen könnte. UB kann ein Schmerz sein. – RastaJedi