C101:ユーザー入力から配列を埋める最良の方法は何でしょうか?
質問
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.
}
アドバイスをいただければ幸いです。
アップデート:
これでうまくいきました!どうもありがとう 全て 皆さんのような即座の反応に感謝します。これは間違いなく素晴らしいコミュニティであり、私を大いに助けてくれています。
解決
arr[idx] <= MAX
あるべきです
idx < MAX
インデックスではなく項目をチェックしている場合を除きます。
また、追加された値を確認する前に idx をインクリメントしているため、常に「次の」要素の -1 (arr[idx] != -1) をチェックします。
それで、もしあなたが持っていたら
arr[idx-1] != -1
あなたは大丈夫でしょう。
他のヒント
arr[idx] <= MAX
あるべきです
idx <= MAX
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 をチェックすることになりますが、これも範囲外であることに注意してください。;) したがって、これを解決する方法を見つける必要があります。
ローマンMさんへ:
まず、質問者さんはプログラミング講座を始めたばかりで、おそらくポインタについてまだ学んでいないでしょう。次に、カウンターとポインターの両方を扱うようになりました。次のようなインデックスを使用する場合と比べて、それを行う利点がわかりません。
for(idx=0;idx < MAX;++idx) {
scanf("%d", &arr[idx]);
if(arr[idx] == -1)
break;
}
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;
}
C 配列は 0 からカウントを開始します。
サイズ MAX の配列を割り当てた場合、MAX で要素にアクセスするとエラーが発生します。ループを次のように変更します。
int arr[MAX];
for ( .... && idx < MAX )
最初の while ループでは、
arr[idx] <= MAX
行を読む必要があります
idx <= MAX
2 番目のループでは、テストの前に idx をインクリメントしています。これは次で終わるはずです。
} while ((arr[idx-1] != -1) && (idx-1 <= MAX));
また、優先順位が正しいことを確実にするために、すべての内部条件を括弧で囲む傾向があります (そのため、上記の余分な括弧が付けられています)。
私ならこのようなものを使います。
配列の境界やその他のわかりにくい条件について心配する必要はありません。
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
}