I have a character array called storebuffer
that contains data from a POST submission and its in the format ssid=abcdef&pswd=ghijk
. I wanted to extract everything after ssid=
into one array called acqSSID
and the portion after &pswd=
into another array called acqPaswd
. I tried using this but it does not seem to be working. MAX_STORE_BUFFER_LEN is 255. Can anyone help?
int ctr = 0;
for (ctr = 5; ctr < MAX_STORE_BUFFER_LEN; ctr++)
{
if ( (storebuffer[ctr] == '&') && (storebuffer[ctr+1] == 'p') && (storebuffer[ctr+2] == 's') && (storebuffer[ctr+3] == 'w') && (storebuffer[ctr+4] == 'd') && (storebuffer[ctr+5] == '=') )
{
break;
}
acqSSID[ctr] = storebuffer[ctr];
}
Serial.print("acqSSID: ");
Serial.println(acqSSID);
Serial.print("ctr: ");
Serial.println(ctr);
2 Answers 2
You can simply chop it up in place without requiring more than a few extra bytes of RAM using strtok()
:
char storebuffer[] = "ssid=abcdef&pswd=ghijk";
// Slice it into two parts around the &:
char *lefthalf = strtok(storebuffer, "&");
if (lefthalf != NULL) { // We found a & and split the string OK
char *righthalf = strtok(NULL, "&");
// Now you can slice each half around the =
char *ssidtag = strtok(lefthalf, "=");
char *ssid = strtok(NULL, "=");
char *pswdtag = strtok(righthalf, "=");
char *pswdtag = strtok(NULL, "=");
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("Password: ");
Serial.println(pswd);
}
The existing string gets chopped up and the pointers point to different places:
ssid0円abcdef0円pswd0円ghijk
^ ^ ^ ^
1 2 3 4
1: ssidtag
2: ssid
3: pswdtag
4: pswd
Rather than acqSSID[ctr] = storebuffer[ctr];
, say (eg) acqSSID[ctr-5] = storebuffer[ctr];
. Also, after the break but before printing acqSSID
, say acqSSID[ctr-5] = 0;
to terminate the string.
Note, rather than coding a literal 5, you might say enum { acqOffset=5 };
up front, and subsequently use acqOffset
in place of the literal.