我使用 arduino MEGA 来解析 url 的参数部分。参数的顺序应该无关紧要。我有以下代码,我用 strtok 尝试过。
char text[] = "ssid=SSID&pwd=PASSWORD&userId=1234"
Run Code Online (Sandbox Code Playgroud)
并将分裂
ssid=SSID
pwd=PASSWORD
userId=1234
Run Code Online (Sandbox Code Playgroud)
并将其再次拆分为键和值
ssid
SSID
pwd
PASSWORD
userId
1234
Run Code Online (Sandbox Code Playgroud)
我尝试使用 strtok 进行第一次拆分。
char *ptr;
ptr = strtok(params, "&");
while (ptr != NULL) {
Serial.println(urlParam);
ptr = strtok(NULL, "&");
}
Run Code Online (Sandbox Code Playgroud)
输出符合预期:
输出:
ssid=SSID
pwd=PASSWORD
userId=1234
Run Code Online (Sandbox Code Playgroud)
然后下一个分裂:
char *ptr;
ptr = strtok(params, "&");
while (ptr != NULL) {
char *paramKey;
char *paramValue;
paramKey = strtok(ptr, "=");
Serial.println(paramKey);
if (paramKey == 'ssid'){
paramValue = strtok(NULL, "=");
Serial.println(paramValue);
ssidName = paramValue;
}
if (paramKey == 'pwd'){
...
}
if (paramKey == 'userId'){
...
}
ptr = strtok(NULL, "&");
}
Run Code Online (Sandbox Code Playgroud)
但输出只是
ssid
SSID
Run Code Online (Sandbox Code Playgroud)
看起来循环工作不正常。
我在哪里犯了错误?有没有其他方法可以解决这个字符串?
该strtok函数使用内部静态变量来跟踪其当前状态。当您将函数用于像您这样交错的多个不同子串时,您就踏上了内部状态。
您需要改为使用strtok_r,它使用外部变量来跟踪状态。
char *ptr, *sav1 = NULL;
ptr = strtok_r(params, "&", &sav1); // outer strtok_r, use sav1
while (ptr != NULL) {
char *paramKey;
char *paramValue;
char *sav2 = NULL;
paramKey = strtok_r(ptr, "=", &sav2); // inner strtok_r, use sav2
Serial.println(paramKey);
if (!strcmp(paramKey, "ssid")) {
paramValue = strtok_r(NULL, "=", &sav2); // inner strtok_r, use sav2
Serial.println(paramValue);
ssidName = paramValue;
}
if (!strcmp(paramKey, "pwd")) {
...
}
if (!strcmp(paramKey, "userId")) {
...
}
ptr = strtok_r(NULL, "&", &sav1); // outer strtok_r, use sav1
}
Run Code Online (Sandbox Code Playgroud)
与解析问题无关,您也无法将字符串与==. 您需要strcmp改用,并且字符串常量用双引号括起来,而不是单引号。