strcmp无法将参数'2'的'char **'转换为'const char *'到'int strcmp(const char *,const char *)'

时间:2019-09-21 18:08:56

标签: c++ arduino strcmp platformio

将arduino nano移植到esp8266

    // list of fields that must be quoted in JSON convertion
     char RFLINK_FIELD_NAME_CMD[]         = "CMD";
     char RFLINK_FIELD_NAME_BAT[]         = "BAT";
     char RFLINK_FIELD_NAME_SMOKEALERT[]  = "SMOKEALERT";
     char RFLINK_FIELD_NAME_SWITCH[]      = "SWITCH";
     char RFLINK_FIELD_NAME_PIR[]         = "PIR";
     char RFLINK_FIELD_NAME_RFDEBUG[]     = "RFDEBUG";
     char* RFLINK_FIELD_STRING[] = {
      RFLINK_FIELD_NAME_CMD,
      RFLINK_FIELD_NAME_BAT,
      RFLINK_FIELD_NAME_SMOKEALERT,
      RFLINK_FIELD_NAME_SWITCH,
      RFLINK_FIELD_NAME_PIR,
      RFLINK_FIELD_NAME_RFDEBUG,
      "\0" // do not remove this mark the end of the array
    };

出现问题的功能:

    /**
     * check wether a given string is in a array of strings
     */
    bool RfLinkIsStringInArray(char *buffer, char* strArray[]) {
      int i = 0;
      int j;

      while((strArray + i) != '\0') {

        j = strcmp(buffer, (strArray + i++));
        if((j==0)) return true;
      }

  return false;
}
In function 'bool RfLinkIsStringInArray(char*, char**)':
 error: cannot convert 'char**' to 'const char*' for 
argument '2' to 'int strcmp(const char*, const char*)'
     j = strcmp(buffer, (strArray + i++));

1 个答案:

答案 0 :(得分:2)

strArray是一个字符串指针数组,由一个零长度字符串的指针(为什么不是NULL指针?)终止。数组本身会衰减为指向其第一个元素的指针。您需要取消引用数组指针以访问各个字符串指针,以便可以将它们传递到strcmp()直至到达该终止符,例如:

bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
    int i = 0;
    int j;
    while (*(strArray + i) != "\0") // <- note the *
    {
        j = strcmp(buffer, *(strArray + i++)); // <- note the *
        if (j == 0) return true;
    }
    return false;
}

或者,仅使用普通数组语法(适用于数组指针)而不是手动指针算术语法:

bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
    int i = 0;
    int j;
    while (strArray[i] != "\0")
    {
        j = strcmp(buffer, strArray[i++]);
        if (j == 0) return true;
    }
    return false;
}

或者,可以完全消除ij变量:

bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
    while (*strArray != "\0")
    {
        if (strcmp(buffer, *strArray++) == 0)
            return true;
    }
    return false;
}

话虽如此,并不能保证代码中两个不同的"\0"字符串文字在运行时将指向相同的内存地址。一些编译器确实合并重复的字符串,但这是非常特定于编译器的行为。您不应该依赖于此。您需要使用strlen(...) == 0来检测终止的零长度字符串,或者最好使用NULL指针。