Welche Include für substr() bei WinAVR?

OP (Firma: www.dartrax.de) #879913
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
OP (Firma: www.dartrax.de) #879927
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
#879945
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.
#879959
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.
#879961
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!
OP (Firma: www.dartrax.de) #879965
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
#879968
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren