Pages: 1 [2]   Go Down
Author Topic: eingelesenen Sring richtig identifizieren  (Read 469 times)
0 Members and 1 Guest are viewing this topic.
at the gate to high forest
Offline Offline
Full Member
***
Karma: 11
Posts: 195
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4125
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
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.
« Last Edit: July 26, 2014, 05:32:09 pm by Serenifly » Logged

at the gate to high forest
Offline Offline
Full Member
***
Karma: 11
Posts: 195
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

Pages: 1 [2]   Go Up
Jump to: