4

bla_2フォームの文字列を取得して分離するこのコードがあります。

void separate(char* str, char* word, int* n) {
    int i = 0;
    while(str[i] != '_') {
        word[i] = str[i++];
    }
    *n = str[++i] - '0';
}

私が得た:

warning: operation on ‘i’ may be undefined [-Wsequence-point]

しかし、私は演算子をi介して変更しているだけ++で、何も割り当てていません。

では、もしそうなら、なぜUBなのですか?そうでない場合、警告を取り除く方法は?

私の意見では、この質問は別の問題を扱っていることに注意してください。

4

2 に答える 2

6

word[i] = str[i++];問題です。

iinがインクリメントさword[i]れる前または後にアクセスされるかどうかは、コンパイラの選択です。istr[i++];

課題のi++後に行う

word[i] = str[i];
i++;

さらにwhile(str[i] != '_')可能性が高いはずです

while(str[i] != '_' && str[i] != '\0')

バッファオーバーランを防ぐため。

于 2014-11-16T20:48:34.993 に答える
2

その理由は、代入の両側が の値に依存しているにもかかわらず、ステートメントでi変更iしていて、 の 2 つの使用の間にシーケンス ポイントがないためですi。C 標準によれば、これにより未定義の動作が発生します。

この警告を修正するには、問題の行を次のように変更します。

word[i] = str[i];
i++;

ちなみに、明示的なインデックスの代わりにポインターを使用することもできます。これにより、おそらくコードがもう少し読みやすくなります。

void separate(char* str, char* word, int* n) {
    while(*str != '_') {
        *word++ = *str++;
    }

    *n = *++str - '0';
}
于 2014-11-16T20:48:54.053 に答える