Hallo, ich brauche die Funktion substr oder eine ähnliche, um einen String auf die ersten x Zeichen zu limitieren. Leider konnte ich nicht herausbekommen, welche library ich einbinden muss oder wo ich das (auch in Zukunft) herausfinde? danke, dartrax
Um den C-String s auf x Zeichen zu limitieren, schreibst du einfach
1 | s[x] = '\0'; |
Okay, danke für die schnelle Antwort, ich werde das gleich ausprobieren. Ich habe folgendes Feld deklariert:
1 | unsigned char day[7][9] = {"Montag \0", "Dienstag \0", "Mittwoch \0", "Donnerst.\0", "Freitag \0", "Samstag \0", "Sonntag \0"}; |
Wenn ich nun einen String ("Montag ") an mein Display schicke mit
1 | lcd_string(day[0]); |
schreibt er mir das ganze Display voll "Montag Dienstag ..." trotz dieser \0 dartrax
Weil sämtliche Strings zu lang sind, und daher die Nullen nicht mit aufgenommen werden. Außerdem sind die "\0" auch überflüssig, da der Compiler ein String-Literal schon von sich aus mit einer Null terminiert. PS: Compiler-Warnungen sollte man nicht ignorieren, insbesondere wenn irgendetwas nicht funktioniert.
Das dachte ich auch, dass der Compiler das selbst macht. Deswegen wundert's mich, dass ich trotzdem alle Strings auf's Display kriege. Wenn das nicht "normal" ist, hab ich aber vielleicht auch einen anderen Fehler im Code. dartrax
Nein, der Fehler ist, dass die Strings zu lang sind! "Montag \0": Montag + 3 Leerzeichen + 2 Nullen = 11 Zeichen Da von diesen 11 Zeichen aber nur 9 reinpassen, werden die beiden Nullen vom Anfang des nächsten Strings überschrieben, so dass nur die Nullen ganz am Ende des 2-dimensionalen Arrays übrig bleiben.
... dartrax ... wrote: > Das dachte ich auch, dass der Compiler das selbst macht. Deswegen > wundert's mich, dass ich trotzdem alle Strings auf's Display kriege. Zähl noch mal deine Zeichen nach unsigned char day[7][9] = {"Montag ", 123456789 Du verbrauchst für die sichtbaren Stellen 9 Zeichen. Die Strings müssen aber 10 (!) Zeichen lang sein, damit das abschließende '\0' Zeichen noch reinpasst!
Ja, vielen Dank, alle guten Dinge sind drei ;-) Ich dachte nur, weil der Compiler doch von sich aus die Strings terminiert, würde ich das überhaupt nicht brauchen. Warum ich es doch brauche, ist mir nicht ganz klar. Mit
1 | unsigned char day[7][11] = {"Montag \0", "Dienstag \0", "Mittwoch \0", "Donnerst.\0", "Freitag \0", "Samstag \0", "Sonntag \0"}; |
hat es jetzt geklappt. Danke nochmal für eure schnelle Hilfe. dartrax
... dartrax ... wrote: > Ich dachte nur, weil der Compiler doch von sich aus die Strings > terminiert, würde ich das überhaupt nicht brauchen. Warum ich es doch > brauche, ist mir nicht ganz klar. Ob der Compiler es terminiert, oder man selber, spielt doch keine Rolle. Die Terminierung muss auf jeden Fall auch mit in den Speicher, also muss man dafür auch den entsprechenden Platz vorsehen. > Mit
1 | unsigned char day[7][11] = {"Montag \0", "Dienstag \0", "Mittwoch \0", "Donnerst.\0", "Freitag \0", "Samstag \0", "Sonntag \0"}; |
> hat es jetzt geklappt. Danke nochmal für eure schnelle Hilfe.
Und jetzt ändere es noch in day[7][10] und nimm die "\0"en raus.
Aaaahh.... Jetzt hab' ich es begriffen. Und was yalu geschrieben hat, funktioniert auch, das habe ich nämlich auch an anderer Stelle gebraucht. Danke! dartrax
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.