1

私は理解に苦労しているため、Cで配列とインデックスを手動で管理しています.これらは私の2つの古典的なアプローチですが、条件に達したときにループし続けるため、機能していないようです:

#include<stdio.h>
#define MAX 255

int main(){

    int arr[MAX]={0};
    int idx=0;

    /* Approach #1 */

    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);

    while(arr[idx-1] != -1 && idx < MAX){
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;        
    }

    /* Approach #2 */

    do{
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;
    }while(arr[idx-1] != -1 && idx < MAX);

    // Main func continues here.

}

どんなアドバイスでも大歓迎です!

アップデート:

今それは動作します!このような即時の応答をありがとうございました。これは間違いなく素晴らしいコミュニティです。私は大いに助けられています。

4

8 に答える 8

4
arr[idx] <= MAX

する必要があります

idx <= MAX
于 2008-09-21T23:50:52.497 に答える
2

forループを使用すると、面倒なidx-1チェックコードが不要になります。

/* Approach #3*/
int i;
int value;

for (i = 0; i < MAX; ++i)
{
  printf("Enter elements, -1 to finish:\n");
  scanf("%d", &value);
  if (value == -1) break;
  arr[i] = value;
}
于 2008-09-22T03:20:06.843 に答える
2

ローマンMへ:

まず第一に、質問者はプログラミング コースを始めたばかりで、おそらくポインターについてまだ学んでいません。次に、カウンターとポインターの両方を扱うようになりました。次のようなインデックスを使用する場合と比較して、それを行う利点があるかどうかはわかりません。

for(idx=0; idx < MAX; ++idx) {

scanf("%d", &arr[idx]);
if(arr[idx] == -1)
    break;

}

于 2008-09-22T00:21:21.440 に答える
2
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

まず、インデックス variabel idx が MAX よりも小さい (以下ではない) かどうかを確認する必要があります。インデックスが MAX に等しい場合は範囲​​外になります。MAX = 10 の配列には、0 から 9 までのインデックス値がありますが、10 はありません。

次に、最初の要素を arr[0] に追加し、インデックスを 0 から 1 にインクリメントしてから、while 条件に戻り、arr[1] == -1 ではないかどうかを確認します。そのため、代わりに arr[idx-1] != -1 を確認してください。ただし、最初に while ループに到達したときに、実際には arr[-1] != -1 をチェックすることに注意してください。これも範囲外です。;) したがって、これを解決する方法を理解する必要があります。

于 2008-09-22T00:07:42.953 に答える
1

C 配列は 0 から数え始めます。

サイズ MAX の配列を割り当てた場合、MAX の要素にアクセスするとエラーになります。ループを次のように変更します。

int arr[MAX];
for ( .... && idx < MAX )
于 2008-09-21T23:54:25.717 に答える
1
arr[idx] <= MAX

する必要があります

idx < MAX

インデックスではなくアイテムをチェックしている場合を除きます。

また、追加された値をチェックする前に idx をインクリメントしているため、-1 (arr[idx] != -1) の「次の」要素も常にチェックしています。

もしあなたが持っていたら

arr[idx-1] != -1

あなたは大丈夫でしょう。

于 2008-09-21T23:54:32.797 に答える
1

最初の while ループでは、

arr[idx] <= MAX

行を読む必要があります

idx <= MAX

2 番目のループでは、テストの前に idx をインクリメントしています。

} while ((arr[idx-1] != -1) && (idx-1 <= MAX));

また、優先順位が正しいことを完全に確認するために、すべての内部条件を括弧で囲む傾向があります (したがって、上記の余分な括弧が必要です)。

于 2008-09-21T23:57:19.563 に答える
1

私はこのようなもので行きます。

配列の境界やその他の紛らわしい条件について心配する必要はありません。

int cnt = MAX;        // how many elements in the array, in this case MAX
int * p = &arr[0];    // p is a pointer to an integer and is initialize to the address of the first
                      // element of the array. So now *p is the same as arr[0] and p is same as &arr[0]

// iterate over all elements. stop when cnt == 0
while (cnt) {

    // do somthing
    scanf("%d", *p); // remember  that *p is same as arr[some index]
    if (*p == -1)    // inspect element to see what user entered
        break;

    cnt --;  // loop counter
    p++;     // incrementing p to point to next element in the array
}
于 2008-09-22T00:15:27.273 に答える