Forum: Mikrocontroller und Digitale Elektronik strlen()


von Hannes Weninger (Gast)


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

von König Europas (Gast)


Lesenswert?

Den null-Character "\0"

von Karl H. (kbuchegg)


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_funktioniert_String-Verarbeitung_in_C.3F

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Hannes Weninger (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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'



von Michael Thom (Gast)


Lesenswert?

Hi,

vielleicht hilft dir diese Seite weiter:

http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/funcref.html

Taz

von Hannes Weninger (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Luigi Rossi (Gast)


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

von Patrick D. (oldbug) Benutzerseite


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

von Karl H. (kbuchegg)


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

von Simon A. (bullwai)


Lesenswert?

Hi,

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
#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.

von Noname (Gast)


Lesenswert?

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

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.