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
peter.m schrieb: > Ich suche eine funktion die ein string im string sucht und mir die > Position zurück gibt. strstr
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?
> 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?
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.
Hier ist die Funktion recht gut beschrieben: http://www.cplusplus.com/reference/clibrary/cstring/strstr/
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
oh danke @Mark Brandis ich schau es mir gerade an
> 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.
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.
@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 :)
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.
:) 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 :(
kann der compailer auch eine funktion in dem man zwei strings vergleichen kann und dann entweder true oder false rauskommt
Kopfschüttel. Du brauchst ganz dringend ein C-Buch. Wirklich dringend.
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.
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 ?
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
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.
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? :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.