zu langen String kürzen



  • Hallo,

    (benutze Borland C++ 5.01)
    ich will verschiedenen Strings in einer Tabelle ausgeben, da manche aber zu lang sind wird die Fomartierung versaut. Deswegen will ich erstmal herausfinden wie ich die Zeichenlänge des Strings zurückgeben kann. Bei Feldern benutze ich strlen(Feld), aber ich bekomme eine Fehlermeldung wenn ich das mit einen String versuche.

    Dann will ich das zu lange Strings abgekürzt werden (aus Teddybär --> Teddyb...). Also habe ich versucht den String in einen Feld zu schreiben, ging auch nicht:

    Aufruf: Kurzmacher(Name) //Name ist ein string
    Implementierung: string Kurzmacher(char Text[100])

    Also größtenteils versuche ich ein string in ein Feld umzuwandeln.

    Dachte ich mir schon, dass sowas nicht funktionieren kann.

    Kann mir jemand dazu helfen?

    Und nochwas: Wie kann ich überprüfen, ob das Einlesen einer Variable mit cscanf("%i", &Varaible) fehlerfrei ablief??

    Danke!



  • Hi,

    Länge: string.length()
    Kürzen: str = str.substr(0, 5); // Kürzt den String auf 4 Zeichen
    

    MfG MAV



  • if(cscanf("%i", &Varaible))
        // alles OK
    else
        // hier gabs Fehler oder es wurde nichts eingelesen
    

    Original aus MSDN:
    Return Value

    cscanf returns the number of fields that were successfully converted and assigned. The return value does not include fields that were read but not assigned. The return value is EOF for an attempt to read at end of file. This can occur when keyboard input is redirected at the operating-system command-line level. A return value of 0 means that no fields were assigned.



  • wenn du einen std::string in char [] umwandeln willst mach das so (eine von vielen mgl:

    char* string_als_char = new char[string_als_string.length() + 1];
    strcpy(string_als_char, string_als_string.c_str());
    

    string_als_char einthät dann den Text vom anderen string, abver eben als char*

    Wenn du nur const brauchst kannst du aber auch gleich std::string::c_str() nehmen



  • Besser, um sich das delete[] zu sparen:

    #include <vector>
    
    ...
    
    std::vector<char> buffer(str.begin(), str.end());
    buffer.push_back(0);
    // &buffer[0] ist jetzt == char*
    


  • Die letzten beiden Einträge verstehe ich nicht, aber das reicht schon um mein Problem zu lösen.

    D.H. Danke!



  • Maschmello schrieb:

    Die letzten beiden Einträge verstehe ich nicht

    Du kannst jederzeit Nachfragen...



  • Gibt es auch die Möglichkeit, dass beim Einlesen von Variablen ein begrenzter Raum für den Benutzer zur Verfügung steht?
    Also der Benutzer soll z.B. sein Alter (int) eingeben, und nun kann er, was ich nicht will, die Leerzeichen-Taste/<ENTER> drücken, und die ganze vorherige Bildschirmausgabe wird versaut.
    Also so eine Art Eingabe-Feld (wie bei einer GUI, aber halt in der Konsolen-Schnittstelle).



  • Nicht mit Standard C++

    Aber dein Betriebssystem bietet wahrscheinlich die Möglichkeit Eingaben von der Tastatur zu lesen, ohne dass sie auf dem Bildschirm erscheinen.

    Da kannst du testen ob die Eingabe korrekt ist, und wenn ja - dann anzeigen, sonst nicht.

    Ist aber mit Standard C++ leider nicht möglich.



  • Schade, aber wenn der Benutzer sowas macht (dauernd ENTER drücken) wird er schon wissen was er tut. 🙂

    Neues Problem:

    //ist 1 zu 1 kopiert, damit ich mir 100%-ig sicher bin: Hier ist bei mir ein Fehler
      do
        {
         f = 1;
         textcolor(WHITE);
         gotoxy (15,2);
         if (cscanf ("%f", &MoneySet))
             f = 0;
         if ((MoneySet < 1)||(MoneySet > Money))
             f = 1;
         if (f!=0)
             {
             gotoxy (15,2);cprintf ("        ");
             gotoxy (15,2);
             }
         }while (f!=0);
    

    Wenn ich eine Taste drücke, die keine Nummer ausgibt, bin ich in eine Endlos-Schleife. Ich will aber, dass nochmal neueingelesen wird.

    Und wenn wir schon dabei sind, kann man überprüfen, ob, wenn keine Zahl eingegeben wurde, ESCAPE gedrückt wurde.
    Ohne das ich ein string, bzw. char-Feld, einlesen muss und bei der Eingabe von Zahlen, das Programm mittels atoi in float umwandle. Also gleich beim Einlesen einer float-Variable, soll überprüft, ob ESCAPE gedrückt wurde.



  • hm, du programmierst hier leider nicht nach C++ Standard.
    Ansonsten würde ich dir raten, diverse error flags zu löschen und eventuell vorhandene zeichen im buffer löschen.
    Vielleicht auf die improved console (siehe Konsolenfaqs) umsteigen, vielleicht grafische Spielereien ganz lassen, wenn du absolut portabel sein musst.
    Standard C++ bietet (nur) eingabestreams, die man nicht nach "drückt user x jetzt in diesem moment eine taste" abfragen kann. ist aber auch nicht für sowas gedacht.
    kannst ja dazu mal im konsolenforum nachfragen.



  • davie schrieb:

    hm, du programmierst hier leider nicht nach C++ Standard.

    Gibt es da einen Standard??

    davie schrieb:

    Ansonsten würde ich dir raten, diverse error flags zu löschen und eventuell vorhandene zeichen im buffer löschen.

    Wie lösche ich Zeichen aus dem buffer?
    fflush(stdin); scheint nicht so ganz zu funktionieren, zumindest wird manchmal ein getch() übersprungen, obwohl davor fflush(stdin) steht.



  • Maschmello schrieb:

    davie schrieb:

    hm, du programmierst hier leider nicht nach C++ Standard.

    Gibt es da einen Standard??

    Aber natürlich.

    Und gotoxy und textcolor sind keine Standard-C++ Funktionen.
    Du kommst allerdings ohne den Standard zu verlassen nicht weiter.

    Daher rate ich:
    ➡ Konsolenforum


Log in to reply