C101:il modo migliore per riempire un array di input dell'utente?
Domanda
Sto avendo un momento difficile la comprensione e quindi la gestione di matrici e indici manualmente in C.Questi sono i miei due classici approcci ma non sembra funzionare, come mantenere il loop quando la condizione è raggiunto:
#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.
}
Qualsiasi consiglio sarebbe molto apprezzato!
Aggiornamento:
Ora funziona!grazie mille tutti voi, ragazzi, per i quali le risposte immediate.Questa è sicuramente una grande comunità, che mi aiuta un sacco.
Soluzione
arr[idx] <= MAX
dovrebbe essere
idx < MAX
a meno che non si stia verificando l'elemento anziché l'indice.
Controlla sempre anche " next " elemento per -1 (arr [idx]! = -1) perché stai aumentando idx prima di verificare il tuo valore aggiunto.
quindi se tu avessi
arr[idx-1] != -1
staresti bene.
Altri suggerimenti
arr[idx] <= MAX
dovrebbe essere
idx <= MAX
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
printf("Enter elements, -1 to finish:\n");
scanf("%d", &arr[idx]);
idx++;
}
Prima di tutto, si dovrebbe verificare se l'indice variabel idx è più piccolo di MAX (non minore di o uguale a).Vorresti andare out of bounds se l'indice è uguale a MAX.Un array con MAX = 10 ha valori di indice 0 e di cui 9, ma non 10.
In secondo luogo, si aggiunge il primo elemento per arr[0], si incrementa l'indice da 0 a 1, quindi si salta indietro di condizione e controllare se arr[1] == -1, il che non è.In modo da controllare invece che arr[idx-1] != -1.Si noti, tuttavia, che la prima volta che si ottiene il ciclo while, sarà effettivamente controllare arr[-1] != -1, che è anche fuori dei limiti.;) Quindi è necessario capire come risolvere questo.
a Roman M:
Prima di tutto, il ragazzo che ha posto la domanda ha appena iniziato un corso di programmazione e probabilmente non ha ancora imparato a conoscere i puntatori. In secondo luogo, ora hai a che fare sia con un contatore che con un puntatore. Non sono sicuro di vedere il vantaggio di farlo rispetto all'utilizzo di un indice come questo:
per (idx = 0; idx < MAX; ++ idx) {
scanf("%d", &arr[idx]);
if(arr[idx] == -1)
break;
}
Utilizzando un ciclo for puoi eliminare la necessità del disordinato idx-1 codice di controllo:
/* 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;
}
Le matrici C iniziano a contare da 0.
Se si alloca un array di dimensioni MAX, l'accesso all'elemento su MAX sarebbe un errore. Cambia il loop in;
int arr[MAX];
for ( .... && idx < MAX )
Nel tuo primo ciclo while,
arr[idx] <= MAX
la riga dovrebbe leggere
idx <= MAX
Nel tuo secondo ciclo, stai incrementando idx prima del test - dovrebbe terminare con
} while ((arr[idx-1] != -1) && (idx-1 <= MAX));
Tendo anche a mettere tra parentesi tutte le condizioni interne solo per essere assolutamente certo che la precedenza sia corretta (da qui le parentesi extra sopra).
Andrei con qualcosa del genere.
Non devi preoccuparti dei limiti dell'array e di altre condizioni confuse.
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
}