Go Down

Topic: eingelesenen Sring richtig identifizieren (Read 696 times) previous topic - next topic

Scherheinz

Quote
Wenn du die Telefon-Nummer gleich mit strstr() suchst, braucht du sie nicht noch mal zusätzlich mit strcmp() zu vergleichen. strstr() gibt dir NULL zurück wenn der String nicht drin ist und einen Zeiger auf den Anfang des Strings wenn ja. Wenn du also etwas anderes als einen NULL-Zeiger hast, dann weißt du dass der String enthalten ist und braucht ihn nicht nochmal zu vergleichen.

Ok nur nochmal zum Verständnis. Ich bekomme ein "NULL" zurück wenn im String nichts gefunden wird. Wenn was gefunden wird, steht der Zeiger dann auf dem Anfang des Strings oder auf dem Anfang der "Telefonnummer" die ja eh mit einer "0" beginnt.?
Das würde dann bedeuten das ich die "0" am Anfang der Nummer nicht mitsuchen dürfte. Weißt du was ich meine?

Quote
Da hatte ich wohl etwas zuweit ausgeholt. Dass man strstr() auch gleich für die Telefon-Nummer nehmen könnte ist mir erst später gedämmert smiley

Macht nix, ich bringe mich meist eh selbst durcheinander.  XD

Quote
Die _P Versionen funktionieren im Prinzip genauso, aber man übergibt halt das String Literal per PSTR() Makro als PROGMEM Konstante, damit es kein RAM belegt.
Das ist nicht immer essentiell, aber man verschwendet auch schnell mehrere hundert Bytes RAM wenn man das nicht macht. Wenn man dann noch RAM-intensive Libs verwendet, kann das problematisch werden.

Ok, braucht mehr RAM, hab ich verstanden, der Rest übersteigt mein Wissensstand :smiley-roll-sweat:
Das Gute ist das ich nicht eine Lib brauche da alles nur über AT-Befehle läuft. Also RAM hab ich noch genug, aber danke für den Tipp!
Eigentlich geht es nur darum das bei einem Anruf von meiner Nummer die GPS Daten abgerufen werden und zusammen mit der Akku Spannung per SMS an mein Handy gesendet werden.

Serenifly

#16
Jul 26, 2014, 11:46 pm Last Edit: Jul 27, 2014, 12:32 am by Serenifly Reason: 1

Wenn was gefunden wird, steht der Zeiger dann auf dem Anfang des Strings oder auf dem Anfang der "Telefonnummer" die ja eh mit einer "0" beginnt.?

Der Zeiger zeigt auf den Anfang des gesuchten Strings in dem Arrays das du durchsuchst. z.B.:
Code: [Select]

char str[] = "123456789";
char* ptr = strstr(str, "45");

ptr zeigt danach auf die '4' in str. Wenn du Serial.println(ptr) machst kommt "456789" raus.

Quote

Das würde dann bedeuten das ich die "0" am Anfang der Nummer nicht mitsuchen dürfte.

Nein. NULL != '0'

NULL ist wirklich 0 in ASCII. '0' ist 48:
http://www.ascii-code.com/

Außerdem ist das ein Zeiger. Das ist eine 16 Bit Variable die die Adresse einer Speicherzelle enthält. Mit dem Inhalt des Speichers hat das erst mal nichts zu tun. Die bekommst einen Zeiger zurück der 0 ist. Nicht einen Zeiger auf eine Speicherzelle in der 0 steht.

In dem Beispiel oben ist ptr die Adresse und *ptr ist der Inhalt. Das hier würde die '4' überschreiben:
Code: [Select]

char str[] = "123456789";
char* ptr = strchr(str, '4');     //Zeiger auf '4', d.h. die Adresse der Speicherzelle in der die '4' steht
*ptr = '1';       //'4' mit '1' ersetzen

ptr = '4' würde die Adresse selbst auf '4', d.h. auf 52, setzten. Das wäre ein schlimmer Fehler

Oder wenn man den Rest des String abschneiden möchte:
Code: [Select]

char str[] = "123456789";
char* ptr = strstr(str, "45");
*(ptr + strlen("45")) = 0;      //Inhalt der Adresse die von ptr + Stringlänge adressiert wird auf 0 setzen

Strings sind NULL-terminiert. Das heißt die Bearbeitung wird beendet wenn NULL/0/'\0' auftritt. Man könnte also den Anfang von "45" suchen und dann die Länge von "45" (2) auf den Zeiger addieren. Der Zeiger zeigt dann auf die '6'. Diese Adresse dereferenziert man (mit dem Stern) und schreibt 0 rein (nicht '0'!).
Wenn man dann str ausgibt kommt "12345" heraus.

Scherheinz

Quote
NULL ist wirklich 0 in ASCII. '0' ist 48:
http://www.ascii-code.com/

Schande über mein Haupt!!

Alles klar jetzt hab ich es geschnallt! Das ist ja cool, dann kann ich mir ja jeden String zurechtschneiden wie ich ihn gerade brauch.
Vielen Dank nochmal!!

Gruß

Go Up