1

我收到编译器警告,代码如下:

uint8 executeSpecialCommand(const char *string)
{
    char *parameters;           
    parameters = strtok(string, "=");

    if (parameters)
     {
         usbSendf("\nProcessing Parameters...");       
         while(parameters != NULL)
         {
             parameters = strtok(NULL, " ");
             usbSendf("\n%s", parameters);
         }
         return 1;
     }
    else
        return 0;   
}

错误指向第 3 行,我认为这是因为“=”。strtok 在我使用相同的代码的其他部分以某种方式期待 const char* 并且我没有收到任何警告。这里有帮助教育我的想法吗?

更新 我得到的错误是:

警告 196:指针目标丢失 const 限定符

谢谢

4

1 回答 1

1

strtok函数修改其第一个参数。从手册页:

BUGS 使用这些功能时要小心。如果您确实使用它们,请注意:

   * These functions modify their first argument.

   * These functions cannot be used on constant strings.

这意味着您可以将 aconst char*作为第一个参数传递,就像使用名为 的变量一样string

strtok通过在每个分隔符处在传递的字符串中插入一个 NULL 来工作,这允许它返回每个令牌而不为返回的字符串分配内存。我怀疑 SDCC 是否支持可重入版本strtok_r,但如果它存在,则可以使用它。

或者,在解析之前创建自己的传入字符串副本。如果您知道最大传入字符串大小,则可以在解析函数顶部的堆栈上分配字符串副本。

于 2013-01-25T05:27:16.943 回答