Wie lese ich einen String richtig ein und teile ihn nach Leerzeichen auf?



  • Hallo, ich möchte einen String für einen Postfixtaschenrechner von der Tastatur einlesen.

    Bsp.: postfix> 44 2 467 3 - - 3 * +

    Nun wollte ich die Zahlen auf einen Stack speichern um die Operationen auszuführen,
    mein Problem ist allerdings, dass ich nicht weis, wie ich das Programm schreiben soll, wenn ich vorher nicht weis, wie viele Eingaben gemacht werden.

    Habt ihr einen Tipp für mich, oder geht es nur über einen sehr komplexen C - Algorithmus(der dann schaut wie viele Zeichen ne Zahl lang ist, oder obs ein Operator ist usw..)?

    Vielen Dank für Eure Mühen



  • stringstreams
    die reagieren auch auf leerzeichen

    und das alles in einem container deiner wahl abgelegt (stack oder vector oder was)



  • danke!!! :->



  • Ich verwende folgende C-Implementierung in meinen Konsolenprogrammen zum Einlesen und Tokenizen:

    bool GetInput(FILE* stream, char input[]) {
      assert(stream != NULL);
      assert(input != NULL);
    
      // Get next input from stream.
      if (fgets(input, INPUT_TOKENS*INPUT_TOKEN_LENGTH, stream) == NULL) {
        if (feof(stream)) {
          return false;
        } else {
          PrintErrorAndExit("GetInput()");
        }
      }
    
      // Overwrite the trailing line feed with null.
      for (int i = 0; i < INPUT_TOKENS*INPUT_TOKEN_LENGTH; ++i) {
        if (input[i] == '\n') {
          input[i] = '\0';
          return true;
        } else if (input[i] == '\0') {
          return true;
        }
      }
      return false;
    }
    
    int Tokenize(const char input[], char token_list[][INPUT_TOKEN_LENGTH]) {
      assert(input != NULL);
      assert(token_list != NULL);
    
      int tokens = 0;
      int index = 0;
    
      // White space characters (0x09 - 0x0D, 0x20) are taken for tokenizing.
      while (true) {
        while (isspace(input[index])) {
          ++index;
        }
        if (input[index] == 0) {
          return tokens;
        }
        for (int i = index; ; ++index) {
          if (isspace(input[index])) {
            token_list[tokens++][index-i] = 0;
            break;
          } else if (input[index] == 0) {
            token_list[tokens++][index-i] = 0;
            return tokens;
          } else {
            token_list[tokens][index-i] = input[index];
          }
        }
      }  // while
    }
    
    bool Loop(FILE* stream) {
      assert(stream != NULL);
    
      char input[INPUT_TOKENS*INPUT_TOKEN_LENGTH];  // 64 KB
      char token_list[INPUT_TOKENS][INPUT_TOKEN_LENGTH];  // 64 KB
    
      while (true) {
        int tokens;
    
        if (GetInput(stream, input)) {
          tokens = Tokenize(input, token_list);
        } else {
          return false;
        }
    
        // Now you have all tokens :-)
      }  // while
    }
    


  • wäre es nicht einfacher es gleich als Zahl und Operator einzulesen? Wozu die Strings?
    Suche mal hier im Forum nach 'Taschenrechner' oder 'polnischer Notation'.

    Gruß
    Werner



  • Bezüglich der Aufteilung nach Leerzeichen bestünde vielleicht die Möglichkeit, eine Stringvariable als Leerzeichen zu definieren und darüber entsprechend aufteilen zu können?
    Beispiel:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    string vorname="Michael";
    string nachname="Mustermann";
    string leerzeichen=" ";
    string name;
    
    name=vorname + leerzeichen + nachname;
    cout<<"Name= "<<name<<endl;
    
    return 0;
    }
    

Log in to reply