使用 strtok 拆分字符串(嵌套)

Mut*_*tus 1 c++ arduino

我使用 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)

看起来循环工作不正常。

我在哪里犯了错误?有没有其他方法可以解决这个字符串?

dbu*_*ush 5

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改用,并且字符串常量用双引号括起来,而不是单引号。