Ich steh grad auf dem Schlauch...
Ich habe einen String, welchen ich von einer Htmlseite übertragen bekomme.
/?check=0&Nummer1=5&Nummer2=45
Wie bekomme ich den String so gespalten das ich sagen kann
int number1 = Nummer1; // Also 5 bei dem Beispiel
Habe bereits versucht mit StringSubstring etwas zu basteln aber erfolglos..
Weil die Länge zu Nummer1 variieren kann. Manchmal wird check=0 nicht übertragen bzw ist 2-Stellig
Lerne mit C Strings umzugehen (d.h. null-terminierte char Arrays). Die Arduino String Klasse ist nicht zu gebrauchen wenn es um Such- und Konvertierungsfunktionen geht. Mit Standard C Funktionen hast du dagegen mehrere Optionen um sowas zu lösen
Hast du vielleicht ein paar Stichwörter (strstr oder strpbrk) für mich wie du es lösen würdest?
strstr() ist schon mal gut um nach einem Teil-String zu suchen. Das liefert einen Zeiger auf den Anfang des Teil-Strings. Dann kannst du per Zeiger-Arithmetik einfach auf den Anfang der Zahl kommen. Also wenn du nach "xyz" suchst +3 machen um das Zeichen danach zu haben. Dann atoi() für die Konvertierung (ascii to integer).
Test Code:
void setup()
{
Serial.begin(9600);
char str[] = "/?check=0&Nummer1=5&Nummer2=45";
char* ptr = strstr_P(str, PSTR("Nummer1="));
int nummer1 = atoi(ptr + 8);
ptr = strstr_P(str, PSTR("Nummer2="));
int nummer2 = atoi(ptr + 8);
Serial.println(nummer1);
Serial.println(nummer2);
}
void loop()
{
}
Da siehst du auch dass das alles in situ gemacht wird. D.h. es wird kein extra Speicher angelegt und du bekommst keine neuen Strings zurück.
Und ich habe mal die _P() Version genommen um RAM zu sparen. So belegen die Such-Strings kein RAM.
boolean GetNummer(char *num)
{
boolean hat_num = false;
char *str_start;
char *str_ende;
int str_len = 0;
int num_index = 0;
str_start = strstr(buff , "&Nummer1=");
if (str_start != NULL) {
str_start = strstr(str_start, "=");
str_start += 1;
str_ende = strstr(str_start, "&ende");
if (str_ende != NULL) {
str_ende[0] = 0;
str_len = strlen(str_start);
for (int i = 0; i < str_len; i++) {
if (str_start[i] == 0) {
break;
}
else {
num[num_index++] = str_start[i];
if (num_index >= 2) {
break;
}
}
}
num[num_index] = 0;
hat_num = true;
}
}
Hab mir jetzt so eine Funktion gebastelt, sie Funktioniert aber gibt halt ein Char, lass es mir aber mit atoi als int ausgeben.
Geht es effizienter?
boolean GetNummer(char *num); // sollte eigentlich true/false zurückliefern.
// arbeitet ziemlich speziell mit einem globalen char* buff
Verbesserungen würde ich nicht als "effizienter" bezeichnen.
Wenn es geht und du zufrieden bist, lass es.
Ansonsten: mindestens würde ich am Ende
...
return hat_num;
}
anfügen.
Die Zeilen
if (str_start[i] == 0) {
break;
}
else
kannst du dir sparen. str_start[str_len] ist definitionsgemäß die erste 0
Ich hätte erwartet, eine Funktion namens GetNummer kriegt einen Text übergeben und liefert die darin enthaltene Zahl zurück. Du hast eher eine Funktion die sucheNummer1 heissen könnte
Stimmt. Habs geändert, dass die Zahl als int zurückgeben wird ist Logischer
Danke