Ergebnis 1 bis 9 von 9

Thema: Problem bei Stringkorrektur

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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)

  2. #2
    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)

  3. #3
    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.

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

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

  6. #6
    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
  •