Forum: Compiler & IDEs Für "Denker" suche nach einer funktion auch selbstgeschrieben


von peter.m (Gast)


Lesenswert?

Hallo

ich hab eine problem ich hoff ihr könnt mir dabei helfen.

Ich suche eine funktion die ein string im string sucht und mir die 
Position zurück gibt.

ich finde keine die der avr compailer kann und selber schreiben hab ich 
auch schon probiert aber nach mehrern stunden kopfzerbrechen geb ich 
jetzt auf
ich hoff ihr könnt mir helfen.

ich hab ein Arry das die zeichen kette enthält in dem ich was such 
nennen wir es Test:

so jetz hab ich noch mal ein arry nennen wir es test2

in test zwei steht als erstes zeichen die länge des gesuchten strings 
zb.5
die darauf folgenen zeichen im test2 ist das wort wo man intest suchen 
möchte.

und am besten wäre es wenn die funktion mir genau den standort im test 
arry das wort ist.


evtl hat von euch jemand eine idee wie man das lössen kann ich bin für 
alles ofen

danke im voraus für die mühe

von Stefan E. (sternst)


Lesenswert?

peter.m schrieb:
> Ich suche eine funktion die ein string im string sucht und mir die
> Position zurück gibt.

strstr

von ... (Gast)


Lesenswert?

strstr

von peter.m (Gast)


Lesenswert?

ich strstr so verstanden das es mir nur sagt ob ein "Zeichen" im arry 
gibt aber nicht wo.

und wie gesagt nur zeichen ich brauch den ort von einem String.

oder versteh ich das falsch?

von Stefan E. (sternst)


Lesenswert?

peter.m schrieb:
> oder versteh ich das falsch?

Ja.

von Karl H. (kbuchegg)


Lesenswert?

> in test zwei steht als erstes zeichen die länge des gesuchten strings

wieso das denn?
Wieso ist das kein Standard-C String, der mit einem '\0' Zeichen 
abgeschlossen ist, so wie das allgemeiner Brauch ist?

von Karl H. (kbuchegg)


Lesenswert?

peter.m schrieb:
> ich strstr so verstanden das es mir nur sagt ob ein "Zeichen" im arry
> gibt aber nicht wo.

Dann lies nochmal die Doku zu strstr. Mit besonderem Augenmerk auf den 
Rückgabewert und was er bedeutet.

von Mark B. (markbrandis)


Lesenswert?

Hier ist die Funktion recht gut beschrieben:

http://www.cplusplus.com/reference/clibrary/cstring/strstr/

von peter.m (Gast)


Lesenswert?

es sind arrys weil ich davor mit den einzelen inhalten hin und her bau 
und so find ich das mit arry es sehr einfach ist.
aber ich brauch ja nur \0 anhängen dann hab ich ein string :)

es könnte so ausschauen das in test das drun steht

Brot    ß908  butter 258551--salz,,,,58

und aus diesem string möchte ich jetz butter auslesen

und im test2 steht im erste kästchen 6 im zweiten das zeichen 'b' und so 
weiter.

und wie finde ich die poaition von demb von butter heraus

von peter.m (Gast)


Lesenswert?

oh danke @Mark Brandis

ich schau es mir gerade an

von Karl H. (kbuchegg)


Lesenswert?

> evtl hat von euch jemand eine idee wie man das lössen kann
> ich bin für alles ofen

Allerdings ist es eine gute Übung für angehende C-Programmierer zb die 
Mehrzahl der str-Funktionen einmal im Leben zu implementieren. Alleine 
die Übung die man dadurch bekommt, ist es dass schon wert (um dann 
natürlich in weiterer Folge strstr zu benutzen, ist schon klar).

Also: Wie machst du das

  "The quick brown fox jumps over the lazy dog."

und der String den du suchst sei "jumps". Wie findest du ihn?

naive Idee:
Wir könnten uns zb fragen, ob der Suchstring mit dem Anfang des Textes 
identisch ist


  "The quick brown fox jumps over the lazy dog."
  "jumps"

Kurzer Character-Check. Nein, passt nicht. Bereits der erste Buchstabe 
ist unterschiedlich.

Also schieben wir den Suchstring eine Position weiter


  "The quick brown fox jumps over the lazy dog."
   "jumps"

passt immer noch nicht. Auch hier wieder: schon der erste Buchstabe ist 
falsch.

Also wieder um eine Position weitergeschoben

  "The quick brown fox jumps over the lazy dog."
    "jumps"

usw. usw.
Bis durch das Schieben diese Position erreicht ist

  "The quick brown fox jumps over the lazy dog."
                      "jumps"

Heureka! Alle Buchstaben des Suchstrings stimmen mit den Buchstaben im 
zu durchsuchenden String überein -> gefunden!  Die Anzahl der 
Verschiebungen ist damit ein Mass dafür, wo der Suchstring im Original 
steht.

Soweit die (banale) Idee. Dein Job: Das zu implementieren.
Besonderes Augenmerk: Wenn der Suchstring nicht enthalten ist, muss das 
auch zuverlässig erkannt werden und nicht endlos verschoben werden.


PS: Das 'Schieben' ist nicht wörtlich zu nehmen. Das dient nur zur 
Veranschauung. Tatsächlich ist die Bedeutung von Schieben einfach nur 
der Index des ersten Zeichens an dem der Suchstring angelegt wird und ab 
dem der Character-Check durchgeführt wird. 'Um 1 weiterschieben' 
bedeutet dann einfach diesen Index um 1 zu erhöhen.

von Hans-Georg L. (h-g-l)


Lesenswert?

Wenn du keine C Strings sondern Pascal Strings verwendest,
solltest du entweder einen Pascal Compiler verwenden oder
dir die Funktion mit Hilfe der for oder while Schleife in C
selbst schreiben.

von peter.m (Gast)


Lesenswert?

@Karl Heinz Buchegger

so war das auch mein grund gedanke

aber das in mein programm ein bauen war das probel weil das wort was ich 
suche sich im verändern kann das gebe ich über uart in mein controller 
ein.

so jetzt muss das absolut eine allgemeine funktion werden egal wie lang 
das wort ist.

durch das es jedes wort sein kann und jede länge dann ist es für mich zu 
schwer geworden eine eigen zu schreiben :)

von Karl H. (kbuchegg)


Lesenswert?

peter.m schrieb:

> so jetzt muss das absolut eine allgemeine funktion werden egal wie lang
> das wort ist.

Na klar. Sonst ist das ganze ja ein wenig witzlos.

> durch das es jedes wort sein kann und jede länge dann ist es für mich zu
> schwer geworden eine eigen zu schreiben :)

?
Die Funktion muss doch von den Wörtern selber gar nichts wissen.
Die kriegt einen String und sie kriegt einen 2-ten String. Zur Not kann 
sie von beiden Strings die Länge feststellen. Wo liegt denn da jetzt das 
Problem? Du musst halt dein Verfahren so formulieren, dass du anstelle 
von konkreten 5 immer die Anzahl der Zeichen im String nimmst. Und das 
ist dann auch schon alles.

Wenn dir das zu schwer ist, dann ist das nur ein weiteres deutliches 
Zeichen, dass du die Funktion zur Übung schreiben solltest.

von peter.m (Gast)


Lesenswert?

:) da hast du auch vieleicht recht
aber jetzt muss ich sie selber schreiben weil "strstr" nicht geht der 
compailer weint rum weil es eine const char sein muss und das geht bei 
mir absolut nicht so ein misst

dann mal weiter rum krübeln wie ich es selber machen kann :(

von peter.m (Gast)


Lesenswert?

kann der compailer auch eine funktion in dem man zwei strings 
vergleichen kann und dann entweder true oder false rauskommt

von Karl H. (kbuchegg)


Lesenswert?

Kopfschüttel.

Du brauchst ganz dringend ein C-Buch.
Wirklich dringend.

von Sam .. (sam1994)


Lesenswert?

Steht doch in der Doku:

> Returns a pointer to the first occurrence of str2 in str1, or a null
> pointer if str2 is not part of str1.

Wenn null dann nicht vorhanden.

von Kai S. (zigzeg)


Lesenswert?

strcmp !

von Hans-Georg L. (h-g-l)


Lesenswert?

Ein C-Compiler kann nur Stringfunktionen mit C-Strings.

Im Klartext: das muss eine /0 hinter den Zeichen stehen !

Strings mit Längenangabe davor sind Pascal oder Delphi Strings und die 
kann ein C Compiler eben nicht.

Was hast du jetzt genau ?

von peter.m (Gast)


Lesenswert?

ja evtl sollte ich mir ein buch zulegen aber dann lerne ich wider c 
sachen die der compailer nicht kann und das ist ja auch ärgerlich finde 
ich :)

ich hab mir jetzt ein eigenes geschrieben und funktioniert "Gott sei 
dank"

war auch für mich viel arbeit

trozdem danke für die hilfe

von asd (Gast)


Lesenswert?

peter.m schrieb:
> ja evtl sollte ich mir ein buch zulegen aber dann lerne ich wider c
> sachen die der compailer nicht kann

Das wage ich mal zu bezweifeln. Du machst nur schlicht etwas falsch, 
weil... tada... du das C Buch noch nicht gelesen hast.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

peter.m schrieb:
> ja evtl sollte ich mir ein buch zulegen aber dann lerne ich wider c
> sachen die der compailer nicht kann und das ist ja auch ärgerlich finde
> ich :)
>
> ich hab mir jetzt ein eigenes geschrieben und funktioniert "Gott sei
> dank"
>
> war auch für mich viel arbeit
>
> trozdem danke für die hilfe

> ja evtl sollte ich mir ein buch zulegen
Auf jeden Fall!

> aber dann lerne ich wider c sachen die der compailer nicht kann
wtf??

... allerdings würde ich dir empfehlen, vorher ein Buch über die 
deutsche Rechtschreibung & Grammatik zu kaufen **kopfschüttel**

> ich hab mir jetzt ein eigenes geschrieben
eigenes Buch? :-)

von Karl H. (kbuchegg)


Lesenswert?

Und PS

Es heißt Compiler, nicht compailer. compailer ist die Aussprache.
Aber das Wort kommt aus dem Englischen: to compile - aufstellen, 
erstellen, zusammenstellen, übersetzen, zusammentragen.

von Karl H. (kbuchegg)


Lesenswert?

peter.m schrieb:

> sachen die der compailer nicht kann und das ist ja auch ärgerlich finde
> ich :)

Das ist Unsinn.
Erstens ist C eine genormte Sprache. Was sich C-Compiler schimpft, muss 
also gewisse Dinge einhalten. Dazu gehören so banale Sachen wie 
Datentypen, deren Umwandlungen, die ganzen Sprachkonstrukte und vieles 
mehr.

Du hast Recht damit, dass einiges, was auf einem Desktop System dazu 
gehört, auf einem µC in der AVR Klasse keine oder nur eine 
untergeordnete Rolle spielt. Dazu gehören zb dynamisches 
Speichermanagement und weite Teile des I/O Systems, dass sich zb mit 
Dateien beschäftigt(*). Das sind Konzepte, die in jedem C-Buch 
unbestritten einen breiten Raum einnehmen, weil sie nun mal relativ 
komplex sind.

Aber: die restlichen 50% des Buches sind auf einem AVR und allen anderen 
C-Systemen identisch (wenn auch in manchen Bereich gewisse Kennzahlen 
variieren). Arbeitest du ein C-Buch durch, bis du bei dynamischer 
Speicherverwaltung angelangt bist, dann bist du auch auf einem PC eine 
lange Zeit beschäftigt und dieses dabei angelernte und geübte Wissen 
(denn jedes ernst zu nehmende C-Buch hat am Ende eines Kapitels eine 
Liste von Übungsaufgaben) kannst du überall hin mitnehmen.

Stringverarbeitung und was eng damit zusammenhängt - Arrays und erster 
Kontakt mit Pointern - ist übrigens im C-Buch irgendwo in den ersten 20 
bis 30% angesiedelt. Da ist also noch jede Menge, sowohl davor als auch 
danach, was du als angehender C-Programmierer wissen und beherrschen 
solltest.


(*) Wobei auch das so nicht stimmt, wenn ich es recht bedenke. Mit 
SD-Karten wird dann auch Filehandling interessant.

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.