Das eigentliche Problem ist, dass man bei Arbeiten mit einem String
Indizes tunlichst vermeiden sollte. So was wird meistens nur umständlich
und langsam. Dazu kommt, dass man sich durch die Indexarithmetik einen
zusätzlichen Datentyp ins Boot holt, von dem a priori nicht klar ist,
wie man ihn dimensionieren soll. Macht man einen unsigned char, dann hat
man zwar (auf einem AVR) schnelle Arithmetik, ist aber auf eine maximale
Stringlänge von 255 Zeichen limitiert. Macht man einen unsigned int, so
hat man (zusätzlich zur ohnehin notwendigen Arithmetik beim Zugriff über
den Index) auch noch einen zusätzlichen 16 Bit Inkrement mit im Boot.
Die maximale Stringlänge von 65535 Zeichen kann man meist verschmerzen.
All das kann man aber vermeiden, wenn man Stringbearbeitung nicht auf
Indizes, sondern auf Pointer aufbaut: Kein zusätzlicher Datentyp,
maximale Stringlänge ist durch eine Systemkonstante (nämlich die sizeof
eines Pointers) festgelegt.
1 | char* pCharacter = newnum;
|
2 | while( *pCharacter != '\0' ) {
|
3 | // mach was mit *pCharacter
|
4 | pCharacter++;
|
5 | }
|
Voraussetzung ist natürlich, dass der String von Anfang an schon richtig
im Speicher steht. Programmintern ist das normalerweise kein Problem,
lediglich an I/O Schnittstellen muss man da ein wenig Sorgfalt walten
lassen. Aber das muss man bei I/O sowieso immer.
(Und immer daran denken, dass ein nuwnum[i] auch nicht gratis
daherkommt)