Variable Zeilenlänge bei festgegebener Breite?
-
Moin zusammen
Ich weiß nicht so recht, in welche Kategorie mein Problem fällt, daher auch die etwas kryptische Überschrift.Ich habe vor, in einem Programm einen formatierten Textblock von ASCII-Zeichen einrahmen zu lassen. (Die Zeichen, die einen simplen Rahmen erstellen)
Dieser Rahmen soll ganz grob so aussehen:========================== | M Vorname Name | | Geburtstag XX.YY.ZZZZ | ==========================
Die dazugehörigen Daten möchte ich aus einem struct auslesen, Name wäre also z.B. person.vorname, person.nachname . Ich habe die beiden Namensfelder mit einer Länge von 10 festgelegt. Das "M" ist hier ein Platzhalter für das männlich/weiblich-Zeichen.
Ich habe mir also errechnet:
Ecke + (Leerzeichen + Geschlecht + Leerzeichen + 10 + Leerzeichen + 10) + Ecke = 25 Zeichen Länge des oberen Teils der Box.Nun ist aber mein Problem: Was, wenn ich die Person "Mia Mau" nenne? Dann steht das da zwar auch drin, aber der Box-abschließende Strich an der rechten Seite der Zeile steht nicht mehr genau unter der dazugehörigen rechten oberen Ecke
Beim Datum klappt's, das ist ja immer gleich lang.Mein Code sieht bisher so aus:
printf("\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 201, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 187 ); printf("%c %c %s %s %c\n", 186, 12, person.vorname, person.name, 186); printf("%c Geburtstag 17.02.1200 %c\n", 186, 186); printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 200, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 188 );
Oh, und wenn es hilft, das ist das Struct:
struct charakter{ char name [10]; char vorname [10] ; long int groesse; long int gewicht; int alter; char geschlecht ; int aussehen; } person;
Ich kann mir vorstellen, dass das ziemlich umständlich ist, lässt sich das vereinfachen?
Aber die eigentliche Frage: Kann mir jemand von euch sagen, wo/wie/was ich formatieren muss, damit die Zeilen mit variablen Längen trotzdem so lang werden, dass der rechte Rand der Box nicht verrutscht? Ist es möglich, die "fehlenden" Zeichen durch Leerzeichen zu ersetzen? Wenn ja: Bitte wie o.Ô?Ich würde mich sehr über eure Antworten freuen
-
Du kannst zwischen dem % und dem s noch Angaben zur Breite und Ausrichtung machen.
Da kann man auch negative Werte eingeben. z.B.: "%-10.-10s"
Probier es einfach mal aus (auch mit 20 statt 10).printf("|%s|\n","Hallo Welt!"); printf("|%10s|\n","Hallo Welt!"); printf("|%-10s|\n","Hallo Welt!"); printf("|%.10s|\n","Hallo Welt!"); printf("|%.-10s|\n","Hallo Welt!"); printf("|%10.10s|\n","Hallo Welt!"); printf("|%-10.10s|\n","Hallo Welt!"); printf("|%10.-10s|\n","Hallo Welt!"); printf("|%-10.-10s|\n","Hallo Welt!");
(Ein paar sind nicht sinnvoll)
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
-
Oh, ich dachte, die funktionieren nur mit %i, dankeschön
Das hat nun auch schon ganz gut funktioniert, nun habe ich dadurch aber noch zwei weitere Probleme entdeckt:
Wenn ich den Charakter Mau Mau nenne, gibt es keine Probleme. Wenn ich den Vornamen allerdings 9 Zeichen eingebe, dazu ein Leerzeichen und danach den Nachnamen, wird mir zwar der Nachname, nicht jedoch der Vorname angezeigt o.O
Und wenn ich dann noch den Vornamen beliebig lang mit XXX eingebe, ein Leerzeichen eingebe und den Nachnamen beliebig lang mit YYYY fülle, kommt bei der Ausgabe 15x X und 25x Y raus.
Aber eigentlich sollen doch nur 10 Zeichen Vorname und 15 Zeichen Nachname gespeichert werden...Der scanf-Befehl sieht folgendermaßen aus:
printf("Wie soll ich heißen?\n\nIch nenne dich: "); scanf("%s %s", &person.vorname, &person.name); printf("\nIch heiße nun also %s %s. Das ist ein schöner Name!\n");
Ich hab schon überlegt, ob ichs per fgets schaffe, aber ich weiß nicht, wie ich das formatieren muss, damit ich beide Eingaben gleichzeitig mache
(Soweit bin ich noch nicht wirklich mit meinen Programmierkenntnissen, ich probier zur Zeit einfach nur drauf los.)
-
Du kannst auch bei scanf die Breite angeben: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
Ich weiß jedoch nicht, ob die '\0' geschrieben wird, wenn du die Breite erreicht hast.Besser ist jedoch, du liest die Namen erstmal in Variablen mit mehr Platz ein und kopierst die dann mit strncpy() in deine struct
-
Nayamis schrieb:
Ich habe vor, in einem Programm einen formatierten Textblock von ASCII-Zeichen einrahmen zu lassen. (Die Zeichen, die einen simplen Rahmen erstellen)
Hat das irgend einen Grund?
Du kannst die Daten doch auch "normal" ausgeben. Dein aktuelles Format mit dem Texteditor mag ja noch für manche einen gewissen ästhetischen Reiz haben, aber sobald man etwas editieren muss, hört der auf. Und das schön anzeigen kannst doch du erledigen. Ich bevorzuge da lieber praktische Lösungen.
-
Nunja, unpraktisch ist es bestimmt, aber ich versuche mich gerade an einem ganz groben Spiel, an dem ich üben kann
Und der Mediendesigner in mir schreit förmlich danach, mal etwas anderes als "nackte" Ausgabezeilen zu sehen, ich mag Deko ^^