Hallo, ich verwende momentan itoa in einem programm um ein EEPROM auszulesen. Meine radix ist 16 also das ich Hexwerte bekomme. Klappt auch alles wunderbar. Nun hät ich aber gern das alles in Großbuchstaben geschrieben ist. Hat da jemand eine Idee??? Gruß
Schau dir die ASCII-Tabelle an, dann addierst du zu den Buchstaben 32 und voila....
Dennis schrieb: > Schau dir die ASCII-Tabelle an, dann addierst du zu den Buchstaben 32 > und voila.... Ascii Tabelle ist gut, aber addiere 'A' - 'a'. Wozu den Programm-Leser mit ASCII-Code Details langweilen, die er nicht wissen muss. Profis benutzen hingegen das alles nicht. Sie benutzen die Standard-C Funktion isAlpha() um festzustellen, ob es sich bei einem Zeichen um einen Buchstaben handelt und dann toupper() um den Buchstaben in einen Grossbuchstaben zu wandeln. Voila, schon interessiert noch nicht mal die ASCII-Tabelle. die ganz schlauen nahmen dann noch nicht mal isalpha() sondern islower(), denn da ist dann die Prüfung auf Kleinbuchstaben auch schon drinnen.
1 | if( islower( c ) ) |
2 | c = toupper( c ); |
diejenigen, die dann die Standard Funktionen kennen, schauen sicherheitshalber noch mal in der Doku für toupper nach und stellen fest, dass sie die Prüfung überhaupt nicht brauchen, weil toUpper schon diese Prüfung beinhaltet.
1 | c = toupper( c ); |
Es lohnt sich halt, wenn man seine Standard-Bibliothek einigermassen kennt. Woher man die kennt? Nun, die Funktionen stehen in jedem einigermassen vernünftigen C-Buch drinnen. Nur lesen müsste man halt erst mal eines. Ach was red ich, haben müsste man halt erst mal eines.
:
Bearbeitet durch User
Hi, vielen dank das werd ich gleich mal testen. Jetzt wo ich das toupper lesen, könnt ich schwören das ich vor langer Zeit schonmal damit was gemacht hatte. Meld mich nochmal sollten weitere Probleme auftauchen :) Gruß
Ich gebe zu, dass ich eigentlich erwartet hätte, dass toupper als Makro implementiert ist, dem ist aber nicht so. So übersetzt sich die Funtkion toupper
1 | 00000d00 <toupper>: |
2 | d00: 91 11 cpse r25, r1 |
3 | d02: 08 95 ret |
4 | d04: 81 56 subi r24, 0x61 ; 97 |
5 | d06: 8a 51 subi r24, 0x1A ; 26 |
6 | d08: 08 f4 brcc .+2 ; 0xd0c <toupper+0xc> |
7 | d0a: 80 52 subi r24, 0x20 ; 32 |
8 | d0c: 85 58 subi r24, 0x85 ; 133 |
9 | d0e: 08 95 ret |
wenn das jetzt noch geinlined wäre, kann man doch nicht meckern. Warum das kein Makro ist? Keine Ahnung, wahrscheinlich war der Leidensdruck nicht hoch genug. Sowas braucht man typischerweise nur an den I/O Punkten eines Programms. Und dafür ist das gut genug.
Karl Heinz Buchegger schrieb: > d04: 81 56 subi r24, 0x61 ; 97 > d06: 8a 51 subi r24, 0x1A ; 26 warum fasst er das nicht zusammen?
Flash Gordon schrieb: > Wie verpuffe ich moeglichst viel Rechenleistung... Ist das hier nicht egal? Es dient dazu, die Ausgabe für den Menschen lesbarer zu machen, also ist die Geschwindigkeit des Auges wohl der limitierende Faktor. Wenns an ein Terminal geht -> dann limitiert noch die Schnittstelle. Wenns in eine Datei geht -> dann limitiert noch der Massenspeicher. Also was schert man sich um die paar Takte.
Peter II schrieb: > warum fasst er das nicht zusammen? Weil dann die Zeile darüber nicht mehr funktioniert:
1 | d08: 08 f4 brcc .+2 ; 0xd0c <toupper+0xc> |
2 | d0a: 80 52 subi r24, 0x20 ; 32 |
3 | d0c: 85 58 subi r24, 0x85 ; 133 |
Das erklaert aber noch nicht, warum die ersten beiden subi nicht zusammengefasst werden:
1 | d04: 81 56 subi r24, 0x61 ; 97 |
2 | d06: 8a 51 subi r24, 0x1A ; 26 |
3 | d08: 08 f4 brcc .+2 ; 0xd0c <toupper+0xc> |
4 | d0a: 80 52 subi r24, 0x20 ; 32 |
5 | d0c: 85 58 subi r24, 0x85 ; 133 |
?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.