Zeilenumbruch in strings
-
Ich hab eine Funktion programmiert, die nach einer gewissen Breite den Text umbricht und auch noch dort wo Zeilenumbrüche im String sind. Das erste funktioniert auch, nur das zweite nicht bei allen Zeilenumbrüchen. Ich hab echt keine Ahnung warum. Anstatt in die nächste Zeile zu springen ist dann an der Stelle immer so ein weißes Viereck mit schwarzen Rand.
void UmbruchAusgabe(string GesamtString) { glTranslatef(0.0f,-1.4f,0.0f); /* Eine Zeile nach unten */ SIZE AktuelleGroesse; /* Speichert die Groesse des Textes */ string HintererTeil; /* Der hintere Teil, also alles nach dem Umbruch */ string VordererTeil; /* Der vordere Teil, also alles davor */ int pos; /* Variabel um die Position eines " " zu speichern */ int pos2; /* Variable um die Position eines "\n" zu speichern */ VordererTeil = GesamtString; /* Zuerst ist der vordere Teil genau gleich dem GesamtString */ AktuelleGroesse = TextGroesse(GesamtString); /* Ließt die Größe aus */ if(AktuelleGroesse.cx > 400) /* Ist der Text eigentlich größer als eine Zeile? Also müssen wir uns überhaupt die Arbeit machen? */ { do { pos = VordererTeil.find_last_of(" "); /* Suche nach " " */ if(pos > VordererTeil.size() || pos == 0) /* Fehler? */ { return; /* Breche ab */ } VordererTeil = GesamtString.substr(0,pos); /* Der vordere Teil kriegt alles vor dem " " */ AktuelleGroesse = TextGroesse(VordererTeil); /* Die aktuelle Größe wird ausgelesen */ } while (AktuelleGroesse.cx > 400); /* Ist der vordere Teil so weit gekürzt das er in eine Zeile passt? */ pos2 = VordererTeil.find_last_of("\n"); /* Suche nach Zeilenumbruch */ if(pos2 != string::npos) /* Zeilenumbruch gefunden? */ { StringAusgabe(VordererTeil.substr(0,pos2)); /* Alles vor dem Zeilenumbruch */ UmbruchAusgabe(GesamtString.substr(pos2+1)); /* Verarbeitet den Rest */ } else { StringAusgabe(VordererTeil); /* Gebe die aktuelle Zeile aus */ UmbruchAusgabe(GesamtString.substr(pos+1)); /* Verarbeitet den Rest */ } } else /* GesamtString passt auch so in eine Zeile... */ { StringAusgabe(GesamtString); /* ...gebe ihn aus */ } }
mfg.
-
es könne vielleicht daran liegen, daß du das new-line mit ausgibst. ersetze die zeile
StringAusgabe(VordererTeil.substr(0,pos2)); /* Alles vor dem Zeilenumbruch */
durch
StringAusgabe(VordererTeil.substr(0,pos2-1)); /* Alles vor dem Zeilenumbruch */
-
Konfusius schrieb:
es könne vielleicht daran liegen, daß du das new-line mit ausgibst. ersetze die zeile
StringAusgabe(VordererTeil.substr(0,pos2)); /* Alles vor dem Zeilenumbruch */
durch
StringAusgabe(VordererTeil.substr(0,pos2-1)); /* Alles vor dem Zeilenumbruch */
Bei den, wo es erkannt wird, fehlt jetzt der letzte Buchstabe, bei den anderen hat sich leider nichts geändert. Der erkennt die ja überhaupt nicht, also pos2 != string::npos ist false.
mfg.
-
schreib den code mal neu. so wie er jetzt ist, ist er doch total unwartbar.
-
wtf... schrieb:
schreib den code mal neu. so wie er jetzt ist, ist er doch total unwartbar.
Wieso?
-
/* blödsinn */
-
FireFlow schrieb:
/* blödsinn */
Hä?
-
joomoo schrieb:
FireFlow schrieb:
/* blödsinn */
Hä?
Ich hatte was geschrieben und erst danach bemerkt dass es dumm war
Neuer Versuch:
#include <iostream> #include <string> void ausgabe(std::string const& str) { std::cout << str << std::endl; } void ausgabeUmbruch(std::string const& str, std::string const& delims, std::string::size_type lineLength) { // Normale Ausgabe wenn kurz genug if(str.length() <= lineLength) { ausgabe(str); } // Ansonsten abschneiden else { std::string::size_type cut = str.find_first_of(delims); // Wenn keine Begrenzer gefunden einfach abschneiden if(cut == std::string::npos || cut > lineLength) { cut = lineLength; } // Ausgabe und Rekursiver Aufruf ausgabe(str.substr(0, cut + 1)); ausgabeUmbruch(str.substr(cut + 1), delims, lineLength); } } int main() { ausgabeUmbruch("Donaudampf-Schiffskaptitaenskabine", " \n\t-",15); }
Hoffentlich ist das das, was du meinst.
Gruß