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関数は最初の引数を変更します。マニュアルページから:

バグこれらの機能を使用するときは注意してください。それらを使用する場合は、次の点に注意してください。

   * These functions modify their first argument.

   * These functions cannot be used on constant strings.

const char*これは、という名前の変数で行っているように、最初の引数としてaを渡すことができることを意味しますstring

strtok渡された文字列にすべてのデリメータでNULLを挿入することで機能します。これにより、返された文字列にメモリを割り当てることなく、各トークンを返すことができます。SDCCが再入可能なバージョンをサポートしているかどうかは疑問strtok_rですが、存在する場合は代わりにそれを使用することは可能です。

または、解析する前に、着信文字列の独自のコピーを作成します。着信文字列の最大サイズがわかっている場合は、文字列のコピーを解析関数の最上位のスタックに割り当てることができます。

于 2013-01-25T05:27:16.943 に答える