Forum: PC-Programmierung getopt(3) mit optionalen Wert


von stefan (Gast)


Lesenswert?

hi leute!

folgender code:
1
while ((opt = getopt(argc, argv, "k.a. was hier genau herkommt")) != -1){
2
3
  switch(opt){
4
5
    case 'f':
6
    hide();
7
    break;
8
      
9
    case 'h':
10
    find();  
11
      
12
    case 'o':
13
    break;
14
      
15
    default:
16
  }
17
18
}

jetzt zur erklärung:
SYNOPSIS: programm -f|-h [-o<filename>]
beim case 'f' gibts jetzt kein problem. nur wie mach ich das, dass bei h 
noch ein o folgen kann, aber nicht muss und der wert hinter o gleich 
verwendet werden kann, weil das der name für eine neue datei wird?

lg
stefan

von Timmo H. (masterfx)


Lesenswert?

Steht doch schön in der Doku:
1
int main(int argc, char *argv){
2
 char *filename == NULL;
3
 int c;
4
5
while ((c= getopt(argc, argv, "fho:")) != -1){
6
7
  switch(c){
8
9
    case 'f':
10
      hide();
11
      break;
12
      
13
    case 'h':
14
      find();  
15
      break;
16
  
17
    case 'o':
18
      filename = optarg; //pointer auf String speichern
19
      break;
20
      
21
    default:
22
  }
23
24
}
25
}

"fho:" => ein Parameter ohne zusätzlichem Wert hat keinen Doppelpunkt, 
ein Parameter auf dem noch etwas folgt (in diesem Fall ein String für 
den Parameter "-o" ) hat ein Doppelpunkt.
Damit dein "find()" dann auch den optionalen Wert von "o" verwenden kann 
musst du das natürlich erst nach deinem Switch machen. Also noch eine 
Zusätzliche Abfrage "if(h_isset && !filename)..."

von Timmo H. (masterfx)


Lesenswert?

char *filename = NULL;
muss natürlich es natürlich heißen.

Am besten ist es wenn du in deinen Switch-Abfragen nur "Flags" setzt, 
denn erst wenn kein Argument mehr gefunden wird, wird die while-schleife 
verlassen. Erst nach der while-Schleife wertest du dann die übergebenen 
Parameter aus und reagierst entsprechend darauf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.