www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik strlen()


Autor: Hannes Weninger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine triviale Frage, die mir aber in meinem Programm ziemlich 
viel Kopfzerbrechen bereitet hat.
Meine Frage wäre, was die Funktion strlen() im String sucht, um die 
Stringlänge festzustellen (nach der Nullterminierung?). Die Länge wird 
ja ohne  die Nullterminierung zurückgeliefert.

Ich habe untere Zeile in meinem Code gehabt und strlen() hat mir viel zu 
viel reinkopiert, sprich strlen hat nicht die richtige Länge 
zurückgegeben sondern viel mehr, ich hab das auf das Display ausgegeben 
und da standen dann noch Daten von einem anderen Array -> also von einem 
anderen Speicherbereich.



memcpy(&ziel[15], &src, strlen(src));
src ist mit einfachen Anführungszeichen festgelegt -> 'ich bin src'

Vielleicht hat da jemand eine Erklärung!

Vielen Dank für Eure ANtworten
lg
Hannes

Autor: König Europas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den null-Character "\0"

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

Bewertung
0 lesenswert
nicht lesenswert
strlen sucht nach dem '\0' Zeichen am Ende jedes Strings.

Warum verwendest du die mem... Funktionen.
Für strings gibt es die str... Funktionen die
das alles berücksichtigen.

   strcpy( &ziel[15], src );

(Das ziel[15], sieht seltsam aus. Möglich wäre es
theoretisch, ich denke aber nicht, dass es richtig
ist. Aber ohne mehr Zusammenhang ist das nicht
zu entscheiden)


> sprich strlen hat nicht die richtige Länge zurückgegeben sondern
> viel mehr, ich hab das auf das Display ausgegeben und da standen
> dann noch Daten von einem anderen Array -> also von einem
> anderen Speicherbereich.

strlen liefert die Länge ohne den '\0'.
Daher hast du den '\0' nicht mitkopiert und daher war
im Ziel auch kein '\0' vorhanden. Alle nachfolgenden
string-Funktionen haben sich daher einen Wolf nach
dem '\0' gesucht und beinhart alles aus dem Speicher
geholt, bis irgendwann dann mal ein '\0' aufgetaucht ist.


http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> src ist mit einfachen Anführungszeichen festgelegt -> 'ich bin src'

Das dürfte due Quelle des Problemes sein. Das ist kein String, sondern 
... irgendwas.

Kompletten Quelltext mit Deklaration/Definition der verwendeten 
Variablen posten, sonst wird's Glaskugelbowling.

Autor: Hannes Weninger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich glaub auch dass bei 'ich bin src' der Fehler liegt, so ist aber 
leider das Datenmodul definiert, welches ich verwende!!

Vielen Dank für Eure Hilfe,

lg
Hannes

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den zweiten Teil meines Beitrages nicht gelesen?

> Kompletten Quelltext mit Deklaration/Definition der verwendeten
> Variablen posten, sonst wird's Glaskugelbowling.

"So ist aber leider das Datenmodul definiert" ... bla. Wenn Du mit 
-anscheinend- falschen Dingen arbeitest, dann musst Du die 
korrigieren; wenn Du damit arbeiten musst, dann musst Du denjenigen, der 
den FEHLER zu verantworten hast, darauf hinweisen.

Es gibt in C keine Strings, die in einfachen Hochkommata notiert werden.

   'ich bin kein String in C'



Autor: Michael Thom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielleicht hilft dir diese Seite weiter:

http://home.fhtw-berlin.de/~junghans/cref/FUNCTION...

Taz

Autor: Hannes Weninger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist eben im Datenmodul möglich, Wörter in einfache Hochkommata zu 
geben und das ist auch so gewollt, Man muss halt dann für die 
Terminierung selbst sorgen und genau das war mein Problem mit strlen, 
aber ich hab jetzt einfach eine fixe Länge eingegeben.

Ich kann das ganze programm nicht posten, es besteht aus 6 Modulen und 
diese sind sehr lang.

Vielen Dank für Eure Antworten und Anregungen!!!!

lg
Hannes

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es ist eben im Datenmodul möglich, Wörter in einfache Hochkommata zu
> geben und das ist auch so gewollt,

Was soll das bitte sein? Um C-Quelltext kann es sich definitiv nicht 
handeln.

Autor: Luigi Rossi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Hannes
Ganz versteh' ich die Sache mit den Hochkommas ja nicht, hier dennoch 
mein Senf dazu...

Ich würde anstelle von
memcpy(&ziel[15], &src, strlen(src));
mal
memcpy(&ziel[15], src, strlen(src));
probieren.
src ist bereits ein Zeiger auf das erste Zeichen des Strings, &src ist 
die Adresse der Variable src, nicht des Strings.

Vielleich hilft das ja ein wenig

lg
Luigi

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Strings könnte das sogar funktionieren, er hat aber gar keinen 
String.
Strings enden in C mit der sog. Nullterminierung, und die muss bei 
einfachen hochkommata, im Gegensatz zu "Gänsefüßchen" explizit angefügt 
werden...

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

Bewertung
0 lesenswert
nicht lesenswert
> aber ich hab jetzt einfach eine fixe Länge eingegeben.

Und das ist .... die Schlechteste aller Möglichkeiten.

Berühmte letzte Worte:
"Meister, ist da Strom drauf? - Nein"
"Das Seil ist gesichert!"
"Der String hat eine konstante Länge!"

Autor: Simon A. (bullwai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab es geschafft, musste nur in der Funktion selbst etwas ändern. Jetzt 
funktioniert alles ohne Probleme!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> Berühmte letzte Worte:
> "Meister, ist da Strom drauf? - Nein"
> "Das Seil ist gesichert!"
> "Der String hat eine konstante Länge!"
"Mein Programm läuft."

Hannes Weninger schrieb:
> Es ist eben im Datenmodul möglich, Wörter in einfache Hochkommata zu
> geben und das ist auch so gewollt
Wenn das (ominöse) "Datenmodul" (vom dubiosen Datenmogul) über ein 
#include eingebunden wird, dann könnte man ja sowas probieren:
#define ' "
;-)

Im Ernst: erwartest du dir allgemeine Hilfe, wenn du spezielle 
Anforderungen hast und diese nicht offenlegst.
Was ist denn dieses "Datenmodul"?
Warum haben deine Programme überhaupt "Module"?
Die "üblichen" Programme bestehen aus Sourcecode- oder Quelltextdateien.

Autor: Noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immerhin hat er nur viereinhalb Jahre gebraucht um das Problem zu lösen. 
:-) Muss sich also wohl um was einfaches handeln.

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.