Hi,
ich will die Strings wegen Speicherproblemen aus einem Sketck verbannen.
Dabei fehlt mir noch eine Funktion, die ich nirgends finde:
String Testtext="Testen ist meist von langer Dauer";
String: int x=Meldung.indexOf("Dauer") // x sagt mit an welcher Position das Wort dauer beginnt
Als Char:
char Testtext[100]="Testen ist meist von langer Dauer";
int x= gesuchteFunktion(Testtext, "Dauer");
habs schon mit strcmp, strncomp, usw. propeiert, hab einfach nichts passendes gefunden.
strstr():
Gibt dir einen Zeiger auf den Anfang des Teil-Strings zurück. Oder NULL wenn nicht enthalten
Siehe auch die vollständige Doku von string.h auf dem AVR:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.ht
ml
Wenn du schon beim Optimieren bist, verwende auch gleich die _P Versionen von String Funktionen, mit denen man den Such-Strings gleich im Flash lässt. Also sowas:
char text[] = "Testblah";
char* pos = strstr_P(text, PSTR("blah"));
Durch das PSTR() Makro belegt dann der Such-String kein RAM
Soweit war ich auch schon,
char str[] ="GET /?dauer=4&1=Reset HTTP/1.1";
char* pos = strstr(str, "dauer");
Serial << "Text: " << str << " Laenge: " << strlen(str) << " Position: " << pos << endl;
while(1);
gibt folgendes zurück:
Text: GET /?dauer=4&1=Reset HTTP/1.1 Laenge: 30 Position: dauer=4&1=Reset HTTP/1.1
ich will aber die Stelle als Zahl und nicht den C-string ab dem gesuchten Wort.
pos enthält "dauer=4&1=Reset HTTP/1.1" anstatt der Zahl 6
Was mache ich falsch?
ich hab mal was zusammengestückelt, was funktioniert, aber das kann es ja wohl nicht sein, oder?
char str[] ="GET /?dauer=4&1=Reset HTTP/1.1";
char* pos = strstr(str, "dauer");
int i=strlen(str)-strlen(pos);
Serial << "Text: " << str << " Laenge: " << strlen(str) << " Position: " << i << endl;
while(1);
jetzt enthält i die Position.
P.S. das PSTR kann ich mal probieren, spart bestimmt 5 byte 
Wenn du an Serial einen char* übergibst behandelt er das natürlich als C-String und gibt den String aus bis NULL kommt.
Mit Zeigern kann man einfach rechnen:
int index = pos - str;
str ist ebenfalls ein char* (Arrays sind Zeiger auf das erste Element). Wenn du also den gefundenen String minus den Anfang des Strings machst hast du die Anzahl der Zeichen dazwischen.
Du solltest dabei aber erstmal testen ob pos != NULL ist. Auch wenn du dir ziemlich sicher bist, dass der Suchstring immer vorkommt, sollte man das immer abfangen wenn man mit Zeigern arbeitet.
Und wie gesagt besser so:
char* pos = strstr_P(str, PSTR("dauer"));
Das spart 6 Bytes RAM. Wenn man das öfters macht läppert such das zusammen
Das ist übrigens genau was die indexOf() Methode der String Klasse intern macht:
int String::indexOf(const String &s2, unsigned int fromIndex) const
{
if (fromIndex >= len) return -1;
const char *found = strstr(buffer + fromIndex, s2.buffer);
if (found == NULL) return -1;
return found - buffer;
}
Ich glaube unsere Postings haben sich überschnitten.
So gehts auf alle Fälle. Vielen Dank für die schnelle und kompetente Hilfe.
Morgen werde ich dann mal den Code umschreiben, muss nur wenige hundert Byte einsparen. Ich mache eine kleine Webserveranwendung mit Pro Mini und ENC28J60 und der UIP lib und basic auth. Damit muss ich 2 Router und 3 Access Points aus der Ferne resetten können.
Da bin ich momentan bei 83% Flasch und 78% RAM, und läuft schon instabil. Prototyp mit UNO und W5100 lief gut.
Du hast strlen() - strlen() gemacht. Du musst einfach nur die zwei Zeiger abziehen. Nicht die Länge der Strings. Ein Zeiger ist nur eine Adresse im Speicher und char belegen nur ein Byte. Daher kann man einfach Adressen voneinander abziehen um die Differenz zu erhalten.
P.S. das PSTR kann ich mal probieren, spart bestimmt 5 byte
6 Byte. Der Null-Terminator kommt noch hinzu 
Bei Text-Ausgaben auf Serial kannst du auch viel RAM sparen:
Serial << F("Text: ") << str << F(" Laenge: ") << strlen(str) << F(" Position: ") << i << endl;
Geht auch bei anderen Klassen die von Print/Stream abgeleitet sind und println()/print() verwenden, wie Client bei Ethernet
Das F-Macro benutze ich schon, sonst wäre das RAM sofort voll.
Das mit den Zeigern muss ich mir mal näher anschauen. Gibt's da irgendwo ein leicht verständliches Tutorial auf deutsch?
Google "C Zeiger" oder "C++ Zeiger". Das gibt es unzählige Seiten
Rechnen mit Zeigern wie hier läuft unter dem Stichwort "Zeigerarithmetik"