2 Stimmen

Optionales Lesen von STDIN in C

Meine Anwendung ist im Grunde eine Shell, die eine Eingabe vom Typ cmd [x] , donde cmd konstant ist und x ist optional. Also cmd 1 ist sowohl legal als auch cmd von sich aus - dann nehme ich einen Standardparameter für x .

Ich tue dies:

char cmd[64];
scanf("%s", cmd);
int arg;
scanf("%d", &arg); // but this should be optional

Wie kann ich den Integer-Parameter auslesen und ihn auf einen Standardwert setzen, wenn in der Eingabeaufforderung gerade keiner verfügbar ist? Ich möchte nicht, dass die Eingabeaufforderung auf eine zusätzliche Eingabe wartet, wenn sie nicht im ursprünglichen Befehl angegeben wurde.

Ich habe mehrere Versionen mit fgetc() y getchar() und vergleichen sie mit EOF aber ohne Erfolg. Jede Version, die ich ausprobiert habe, wartet am Ende auf den optionalen Integer-Parameter.

3voto

leeeroy Punkte 10886

Der einfache Weg:

   char b[73]; //powers of 2 magic is evil.
    if(fgets(b,sizeof b,stdin) != NULL) {
      char cmd[59]; //59, no command will ever be > 58. Ever I say.
      int arg;
      if(sscanf(b,"%58s %d",cmd,&arg) == 2) {
         //handle cmd and arg
      } else if(sscanf(b,"%58s",cmd) == 1) {
         //handle cmd only
      } else {
       // :-/
      }
    }

2voto

Einfache Antwort: Das geht nicht. Die C-Laufzeitumgebung nimmt Eingaben des Betriebssystems entgegen, steuert es aber nicht. Um so etwas zu tun, müssen Sie direkt mit dem Betriebssystem über plattformspezifische APIs interagieren.

1voto

Juliano Punkte 35709

Lesen Sie Zeile für Zeile? Können Sie nicht einfach den ganzen Befehl lesen, bis Sie zu einem " \n " (Zeilenumbruch)? Wenn Sie zwei Zeichen vor dem Zeilenumbruch erhalten, handelt es sich um einen Befehl und das Argument; wenn Sie nur eines lesen, handelt es sich nur um den Befehl und Sie setzen das zweite Argument auf den Standardwert.

0voto

Jared Forsyth Punkte 12101

Hier ist ein Programm, das funktioniert (entschuldigen Sie, dass meine vorherige Antwort in Eile verfasst wurde).

int main(){
    char cmd[100], line[100];
    int man = 0;
    printf("OK: ");
    fgets(line, 100, stdin);
    int num = sscanf(line,"%s %d",cmd,&man);
    if (num==1)printf("one! %s %d\n", cmd, man);
    else if (num==2)printf("two! %s %d\n", cmd, man);
}

fgets liest die Zeile (mit Überprüfung der Grenzen), und sscanf prüft, ob ein oder zwei Token eingegeben wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X