www.mikrocontroller.net

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


Autor: ... dartrax ... (Firma: www.dartrax.de) (dartrax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

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

Autor: ... dartrax ... (Firma: www.dartrax.de) (dartrax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, danke für die schnelle Antwort, ich werde das gleich ausprobieren.

Ich habe folgendes Feld deklariert:
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
lcd_string(day[0]);

schreibt er mir das ganze Display voll "Montag   Dienstag   ..." trotz 
dieser \0

dartrax

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... dartrax ... (Firma: www.dartrax.de) (dartrax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ... dartrax ... (Firma: www.dartrax.de) (dartrax)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: ... dartrax ... (Firma: www.dartrax.de) (dartrax)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.