2016-09-19 7 views
2

私はC言語の新機能で、可変長の配列から整数5を削除する関数内で関数を処理しようとしています。その後、配列に対応します。 a[0]は、配列の長さを決定する配列内の要素です。 vは配列から削除される要素です。残りのコードと他のすべての詳細については、これが考慮されます。 、あなたはそれが意味をなすためには、この関数の外側のコードの残りの部分を参照する必要がある場合Cの配列から要素を削除しようとすると予期しない結果が出る

void delete_set(int v, int a[]) 
{ 
    int i; 
    int j; 

    for (i = 0; i < a[0]; i++) 
     if (a[i] == v) 
     { 
      for(j = i; j < a[0]; j++) 
       a[j] = a[j + 1]; 
      a[0] = a[0] - 1; 
     } 
} 

だから、私はわからないよ:

以下は、私は機能のために書かれているコードです。しかし私の問題はこれです。私がa[i] ==に(ifステートメントで)何を設定したとしても、読み込まれる配列の長さがまさにその数であれば、私は予期しない答えを得ます。しかし、配列の長さの他の読み込みでは、期待通りの結果が得られます。この問題が私にどのように提示されたかのように、コーディングの変更は関数内で行われなければなりません。

ありがとうございました。長い投稿を申し訳ありません(該当する場合)。私はフォーラムを使うのにあまり慣れていない。

+1

[0]は[0]を含む配列の長さですか? –

+0

'if(a [i] == v)' - > 'while(a [i] == v)' – BLUEPIXY

答えて

2

あなたは、それがあるべき長さを保持している要素をスキップする必要があります。それは実際にあなたの配列の要素(および長さではありませんでしたかのように、あなたの外側のループはa[0]を見ているよう(i = 1; i <= a[0]; i++)

+0

ありがとう、これは魅力的でした!あなたはこの笑い声をどのくらいの間働かなくてはいけないのか想像できませんでした。あるいは、あなたができるかもしれません... – Modrummer

+0

@Modrummer私は一度、 '; 'であったはずの'、 'を見つけようと一週間過ごしました。同僚が歩き、一見して「セミコロンの代わりにカンマがあることを知っていますか?」と言った。 – Tibrogargan

2

ため に見えます)。試してみてください:あなたは三つの要素を持っている場合、彼らはa[1]a[2]、およびa[3]になりますので、私はそこに<=を使用したことも

for (i = 1; i <= a[0]; i++) ... 

注意してください。これをしないと、配列内の最後の要素が削除されることがあります。

+0

'<=' – Tibrogargan

0

a[0]が配列の長さの場合、削除する必要がありますか?最初にそれを保存せずに?また、元の配列のすべての要素をシフトしてはいけませんか? 1回だけ?

アルゴリズムをリファクタリングする必要があります。ヒント:現在のインデックスと削除された要素の数を持つループは1つだけ必要です。

0

内側ループにも問題があり、配列の終わりを過ぎると問題が発生します。要素の数を変更する配置を、要素をコピーするforループに置き換える必要があります。 a [0]がa [0]を含む配列の長さであるとすると、次のようになります。

for (int i = 1; i < a[0]; ++i) { 
    if (a[i] == v) { 
     a[0] = a[0] - 1; 
     for (int j = i; j < a[0]; ++j) { 
      a[j] = a[j + 1]; 
     } 
    } 
}