Forum: Compiler & IDEs Welche Include für substr() bei WinAVR?


von ... dartrax .. (Firma: www.dartrax.de) (dartrax)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

Um den C-String s auf x Zeichen zu limitieren, schreibst du einfach
1
s[x] = '\0';

von ... dartrax .. (Firma: www.dartrax.de) (dartrax)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von ... dartrax .. (Firma: www.dartrax.de) (dartrax)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

... 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!

von ... dartrax .. (Firma: www.dartrax.de) (dartrax)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

... 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.

von ... dartrax .. (Firma: www.dartrax.de) (dartrax)


Lesenswert?

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
Noch kein Account? Hier anmelden.