Ergebnis 1 bis 9 von 9

Thema: Problem bei Stringkorrektur

  1. #1

    Problem bei Stringkorrektur

    Hallo erstmal!

    Ich weiß, ein merkwürdiger Titel, aber ich weiß einfach nicht wie ich es anderes ausdrücken soll. Ich bin am verzweifeln. Google ergab auch nichts.

    Mein Problem: Ich schreibe gerade eine Klasse, die Usereingaben verwertet. Momentan sitze ich an einem Userinput. Die Grundstruktur steht.. und funktionieren tut sie auch so halbwegs, allerdings habe ich ein Problem: Drücke ich die backspace Taste, wird der String einfach nicht überschrieben, sondern einfach nur der Zeiger innerhalb des Strings um eine Stelle nach hinten versetzt. Das .. nervt. Und es ist einfach blöde. Ich fände es nett, wenn ihr mir helfen könntet. Hier der Code:


    Code:
    string input::userinput(int passchar = 0) {
      cout<<"Bitte geben sie hier iher gewuenschten Werte ein:"<<endl;
      
      int currentkeyvalue;
      string currentstring;
      int end = 0;
      
      while(end != 1) {       //Solange end != 1 ;D
        if(kbhit())               //Wird eine Taste gedrückt?
        {
          currentkeyvalue = getch();          //Aktuellen Keywert in currentkeyvalue schreiben
          
          if(currentkeyvalue == 13) { //Return
            end = 1;
          }
          else if(currentkeyvalue == 8) //Backspace
          {
            currentstring = currentstring.substr(0, currentstring.length()-1);
          }
          else
          {
            currentstring += currentkeyvalue;
          }
          
          currentkeyvalue = 0;
          cout<<"\r"<<(string) currentstring<<"\r";    
        } 
       
      } 
    
       return (string) currentstring;           
    }

  2. #2
    Beim Befehl

    Code:
    currentstring = currentstring.substr(0, currentstring.length()-1);
    passiert an sich noch nichts. currentstring wird zwar mit einem String, der ein Zeichen weniger am Ende hat überschrieben, doch das letzte Zeichen bleibt bei currentstring erhalten. Am besten ersetzt du das hinterste Zeichen durch ein Leerzeichen:

    Code:
    currentstring = currentstring.substr(0, currentstring.length()-1) + ' ';
    Auch wenn ich denke, dass es noch elegantere Methoden dafür gibt. Aber probiers mal aus.

    EDIT:
    Könnte es sein, dass du currentstring auch gleich wieder verkürzen möchtest? Das Problem an der String-Klasse ist ja, dass Strings implizit dynamisch behandelt werden. Ich weiss nichtmal, ob es überhaupt möglich ist, den String zu verkürzen. Falls nicht, würde ich dir empfehlen den String als dynamisches array auf char zu definieren. Hierbei musst du allerdings für jedes neue Zeichen mit new einen um 1 längeres array anlegen, den alten rüber kopieren und mit del wieder löschen. Bei der bachspace-Taste analog das umgekehrte. Wenn du willst, kann ich mir mal einen Code überlegen, aber ohne Garantie. ^^

    Geändert von TheBiber (18.02.2007 um 14:45 Uhr)

  3. #3
    Naja, verkürzen würdest du ihn mehr oder weniger, indem du nicht ' ' sondern '\0' oder 0 anhängst.

  4. #4
    Ich probiere mal das mit dem überschreiben mit einer Null aus. Danke schonmal. ^^

    €dit: Leider funktioniert es nicht, eine \0 anzuhängen... Aber ihr habt mih auf eine idee gebracht..^^

    €d2:

    Iwie kann er jetzt einmal die Backspace Taste benutztn..es funktioniert. aber wenn ich sie zweimal hinternander Drücke..Unsinn... ich verscuhe mal eben eine Fnktion zu schreiben, die einen String kürzt... hab da sone..idee..^^

    Geändert von raian (18.02.2007 um 20:05 Uhr)

  5. #5
    Zitat Zitat von the Biber
    Beim Befehl

    Code:
    currentstring = currentstring.substr(0, currentstring.length()-1);
    passiert an sich noch nichts. currentstring wird zwar mit einem String, der ein Zeichen weniger am Ende hat überschrieben, doch das letzte Zeichen bleibt bei currentstring erhalten. Am besten ersetzt du das hinterste Zeichen durch ein Leerzeichen [...]
    Wieso sollte da nichts passieren ? substr gibt ein neues stringobjekt zurueck, wodurch von currentstring der operator= aufgerufen wird, und der inhalt ordnungsgemaess ersetzt wird.

    Ich hab das ganze mal mit einem simplen Programm getestet ..
    Code:
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(int argc, char** argv) {
       string s;
       cin>>s;
       s = s.substr(0,s.length()-1);
       cout<<s<<endl;
       return 0;
    }
    und damit funktioniert das abschneiden ...

    Wo dein genaues Problem liegt weiss jetzt auch auf anhieb nicht, da ich deinen code nicht compilieren kann. conio.h IST BOESE, denn das ist nicht im C(++) Standard enthalten und bei der gcc damit nicht dabei. Ausserdem ist es nicht plattformunabhaengig. Verwende fuer sowas vielleicht lieber ncurses ...

    [03:22 Uhr] Ich hab noch ne idee, woran es liegen koennte ...
    Da du conio.h verwendest, denke ich mal, du arbeitest unter Windows ...
    Unter windows ist das Zeilenendezeichen #10#13, also \r\n und nicht nur #13, wie unter linux. Dadurch kann es sein, dass du, da du nur auf #13 pruefst als letztes Zeichen ein #10 an deinem String anhaengst. oder sowas ... vielleicht solltest du nur Zeichen an den String anhaengen, die >=32 sind ... einen Test ist es wohl wert.

    [08:54 Uhr] OK, jetzt ist es amtlich - man sollte malt nicht um halb vier in der Nacht Ratschlaege erteile, wenn man um hal sechs erst ins Bett kommt und um halb neun schln aufstehen muss. Das Problem ist recht einfach ... du ueberschreibst zwar den String, den du bereits eingegeben hast korrekt und auch in deiner Variablen ist der String korrekt lang, ABER du ueberschreibst ihn ja nicht am BILDSCHIRM. Wenn du mit \r an den Zeilenanfang springst, bleibt ja der Rest der Zeile weiterhin zu sehen und du lueberschreibst immer nur den Zeilenanfang, weshalb es so aussieht, als wuerdest du mit dem Cursor nach links gehen, wenn du backspace drueckst. Eine simple Loesung des Problems waere es, wenn du an den Zeilenanfang mit \r springst, die ganze Zeile loescht (ncurses verwendet dazu clrtoeol siehe `man curs_clear`, conio.h wird etwas aehnliches haben) udn erneut mit \r an den Zeilenanfang springst und deinen String ausgibst.

    Geändert von Ineluki (20.02.2007 um 08:03 Uhr)

  6. #6
    Zitat Zitat von Ineluki Beitrag anzeigen
    Wieso sollte da nichts passieren ? substr gibt ein neues stringobjekt zurueck, wodurch von currentstring der operator= aufgerufen wird, und der inhalt ordnungsgemaess ersetzt wird.
    Stimmt, das Nullzeichen erscheint ja damit eine Stelle weiter vorne...
    Ich hab wohl dringend noch Nachholbedarf, noch 4 Wochen bis wir mit Java beginnen.

  7. #7
    Ich hab mir aus vielen kleinen Antworten eine große zusammengeschustert. Es klappt jetzt. Danke euch allen. =)

  8. #8
    na dann zeig doch mal her ^__^

  9. #9
    Nunja, ich werds gleich editieren..aber die Lösung ist ganz eifnach: gegebenenfalls am ende das Zeihen mit einer \0 Überschreiben...^^"

    Code:
    string input::userinput(int passchar = 0) {
           /* Maximal  90  Zeichen! */
      cout<<"Bitte geben sie hier iher gewuenschten Werte ein:"<<endl;
      
      int currentkeyvalue;
      string currentstring;
      int goback;
      int end = 0;
      
      while(end != 1) {       //Solange end != 1 ;D
        if(kbhit())               //Wird eine Taste gedrückt?
        {
          currentkeyvalue = getch();          //Aktuellen Keywert in currentkeyvalue schreiben
          
          if(currentkeyvalue == 13) { //Return
            cout<<"\r";
            end = 1;
          }
          else if(currentkeyvalue == 8) //Backspace
          {
            if(currentstring.length() >= 1) {
              currentstring.erase(currentstring.length()-1, 1);
            }
            goback = 1;
          }
          else if(currentkeyvalue == 10) {
             cout<<"\a";  
          }
          else {
            currentstring += currentkeyvalue;
          }
    
    
          if(passchar != 1) {
            cout<<"\r"<<(string) currentstring;
          } 
          else 
          {
            cout<<"\r";
            for(int i=0;i<currentstring.length();i++) {
              cout<<"*";
            }
          }
    
          
          if(goback==1) {
            if(currentstring.length() > 0) {
              cout<<" \b\r";
            }
            else {
              cout<<"\a\r";
            }
            goback = 0;              
          }
              
        } 
       
      } 
      cout<<"\r";
      for(int i=0;i++;i<currentstring.length()) {
        cout<<"\0";
      }
       cout<<"\n";
       return (string) currentstring;           
    }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •