Gibt es eine Möglichkeit, text zu formatieren Ausgabe in Ada
Gibt es eine Möglichkeit zum formatieren der Zeichenfolge wird ausgegeben?
Ich versuche, Holen Sie sich einen Blick auf die folgende Ausgabe
1: Ashley | 01033438392 | Wellington, New Zealand | 1987- 4-14
2: Aloha | 01087651234 | Hawaii, United States of America | 1988- 9-23
3: Jack | 01082840184 | Beijing, China | 1989- 6-19
Wenn ich in C Programmieren, ich möchte etwas tun, wie
printf("%10s | %11s | %20s | %4d-%2d-%2d\n",name,phone,address,year,month,day);
Wäre es möglich, das zu tun diese Art der Formatierung in Ada 05?
PS Bitte einfach ignorieren, die Namen, Telefonnummern, Adresse, und Geburtsdatum. Ich habe Sie in etwa 30 Sekunden...
- Hmmm. Es occurrs mir, dass es möglich wäre die Schaffung eines "format string" geben könnte, Dinge zu tun, wie dies in einer mehr typsicher, als
printf
. Das wäre ein nettes kleines Projekt für jemanden,...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es kann getan werden, aber die Mechanismen sind etwas umständlich und durchaus ein wenig Ausführlicher.
Was würde ich in der Regel tun, ist schreiben getrennten Verfahren zu behandeln komplizierter Ausgabe, z.B. Termine und verwenden, die mit dem rest des string-handling für Klarheit.
Dies durchzusetzen, Felder fester Länge, die Optional ermöglichen das abschneiden von langen strings, oder sonst verschieben nachträgliche Einträge auf der nächsten Zeile. Set_Col wird die line-position für den nächsten schreib -, potenziell stellen Sie es auf die nächste Zeile, wenn die aktuelle schreib-position hat bereits überschritten die man beantragt.
Warf ich das abschneiden der Zeichenfolge in es als chance zu nutzen-array-slicing und Text_IO output-manipulation, aber ich bin generell kein fan von Standard-Trunkierung, so dass der string zum überlaufen der angeforderten Breite oder jeweils eingerückt in der nächsten Zeile neigen formatieren Fehler offensichtlicher.
So drucken Sie so etwas wie Ihre erste Zeile, da der code von oben, könnte so Aussehen:
Text IO in Ada ist in der Regel umständlich, aber in der Regel ist die Tugend machen, was Sie sind dabei relativ klar.
Integer_IO
. Für die Bequemlichkeit,Integer_Text_IO
kann schon definiert werden.Beachten Sie, dass in C++ in diesen Tagen
printf()
ist am Rande des seins abgewertet werden, zugunsten von streams mit stream formatter. Es ist bequem, aber äußerst unsicher (zumindest in ein paar Sinne des Wortes). In diesen Tagen werden Entwickler aufgefordert, die C++ - streams (mit Ihren geordneten Manipulatoren) statt.In Ada können Sie strings manipulieren in einem sehr ähnlichen Stil von C++ - streams mithilfe der string-Kette Betreiber
&
wo die C++ - Leute, verwenden Sie die stream-insertion-operator (<<
). In gewisser Weise, Ada ' s Methode ist besser, denn Sie können nest catenated Ausdrücke, die Sie nicht tun können, mit Strom-Ausdrücke eingefügt.Das problem hier ist, dass es nicht jeder handy-äquivalente der C++ - Formatierer wie
setfill()
,hex
, undsetw()
. Es sollte wirklich sein, und (hex
ausgenommen), Sie sind nicht schwer zu schreiben, selbst, aber für jetzt Sie nicht existieren.Beispielsweise eine
setw()/setfill()
äquivalent wäre so etwas wie:Wenn Sie wirklich wollen, eine
printf()
- Schnittstelleprintf()
ist ganz callable von Ada natürlich. Sie haben zu sorgen über den übergang zwischen Ada ' s große Streicher-und C-s nul-terminierte strings, aber das ist, wasAda.Interfaces.C.Strings
ist es für.Ada.Strings.Fixed."*"(Width - Source'length, Fill_Char)
in meinemelse
Zweig ermöglichen es Ihnen, um loszuwerden, das Rekursion.return ((Width - Source'length) * Fill_Char) & Source;
.std::setfill()
aber, das ist was ich versucht habe, Sie zu kopieren. Ich bin kein großer fan von hinzufügen implizite Staat, aber seine Ihr Paradigma.sprintf()
) ist wahrscheinlich der größte Gegner von Pufferüberlauf-exploits in die Welt. Es gibt ganze hacker-websites gewidmet, um zu helfen finden und auszunutzen, verwendet dersprintf()
.Ja, es ist. Obwohl es nicht so einfach, wie in c.
Haben Sie einen Blick auf §A. 4.4 Begrenzt-Länge String-Handling zu erstellen, wie für strings, die eine vordefinierte Größe haben, und verwenden Sie integer ' Image konvertieren Sie Ihre zahlen. Die & - operator ist nützlich, um strings verketten und Ausgabe der ada.text_io.put_line().
Ada.Text_IO.Integer_IO
nicht. Siehe auch §A. 4.3 Fixed-Length-String-Handling.Möchten Sie vielleicht, diese einfache - Karte-Spiel-simulation verwendet
Ada.Strings.Fixed
formatieren Bereich Achsenbeschriftungen für eine ASCII-Grafik. Sehenfunction Label
verwendetTail
undTrim
zum formatieren derInteger'Image
einerLower
undUpper
Wert.Code:
Konsole:
Gibt es Hilfsmittel für dieses Besondere format setup.
Paket Ada.Text_IO.Integer_IO
Legt ein Feld mit
Item
ausgerichtet, um die Rechte und white-space-Zeichen als Füllstoff. WoWidth
ist FeldbreiteBase
10 als defualt.Paket Ada.Strings.Behoben
Gibt einen formatierten string. Wo
Count
ist das Feld Breite undPad
ist Füllstoff für das Feld.Head
richtet string nach Links.Tail
richtet string nach rechts.Lassen Spaltenbreite 8 Zeichen lang ist und benutzen dash als Füllstoff.
- Ausgang
Attribut discrete_type'Breite
Gibt eine Länge, die der diskrete Art benötigt werden als text dargestellt werden.
Beispiel
- Ausgang
Ich würde empfehlen, zu erstellen, geben Sie eine Telefon-Nummer, ich weiß nicht, wenn es sein sollte, string oder eine Zahl mit den über der Position der Nullen Telefonnummer kann unterschiedliche Länge, denke ich.
'Width
Attribut, nice one.Können Sie auch die
GNAT.Formatted_String
Paket.Es funktioniert zumindest mit Ada 2012 (kann nicht überprüfen, ob es existiert in Ada, 2005).
Es ist sehr ähnlich zu printf Gebrauch, aber mit einer leichten syntaktischen Unterschied.
Hier ist ein funktionierendes einfaches Beispiel http://tpcg.io/iJwfWa :
Ausgabe :
Weiteres Beispiel mit Ihren Eingaben http://tpcg.io/iJwfWa :
Ausgänge:
Beste Beispiel sehen Sie in der
g-forstr.ads
- Datei mit gnat :+"myformat: %s"
scheint verändert werden, wenn die Lösung der Formatierung (mit-(myformat & value)
in einigen Fällen. Der trick dabei ist erneut zu erbringen, Affektiertheit-format in jeder Schleife starten.-- Note that a Formatted_String object can't be reused as it serves as recipient for the final result. That is, each use of "&" will build incrementally the final result string which can be retrieved with the "-" routine below.
Besser gewarnt werden.