C101: le meilleur moyen de remplir un tableau à partir d'une entrée utilisateur?

StackOverflow https://stackoverflow.com/questions/112582

  •  02-07-2019
  •  | 
  •  

Question

J'ai du mal à comprendre et donc à gérer manuellement les tableaux et les index en C. Ce sont mes deux approches classiques, mais elles ne semblent pas fonctionner car elles continuent à tourner en boucle lorsque la condition est atteinte:

#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.

}

Tout conseil serait très apprécié!

Mise à jour:

Maintenant ça marche! Merci beaucoup à tous d'entre vous pour ces réponses instantanées. C’est vraiment une grande communauté qui m’aide beaucoup.

Était-ce utile?

La solution

arr[idx] <= MAX

devrait être

idx < MAX

sauf si vous vérifiez l'élément à la place de l'index.

Vous vérifiez également toujours la " suivante " élément pour -1 (arr [idx]! = -1) car vous incrémentez idx avant de vérifier votre valeur ajoutée.

donc si vous aviez

arr[idx-1] != -1

vous iriez bien.

Autres conseils

arr[idx] <= MAX

devrait être

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

Tout d’abord, vous devez vérifier si la variabel index idx est inférieure à MAX (pas inférieure ou égale à). Vous sortiriez des limites si votre index était égal à MAX. Un tableau avec MAX = 10 a les valeurs d'index 0 à 9 inclus, mais pas 10.

Deuxièmement, vous ajoutez le premier élément à arr [0], vous incrémentez votre index de 0 à 1, puis vous revenez à la condition while et vérifiez si arr [1] == -1, ce qui n'est pas le cas. . Donc vérifiez plutôt que arr [idx-1]! = -1. Notez cependant que la première fois que vous atteignez la boucle while, vous allez réellement vérifier arr [-1]! = -1, ce qui est également hors limites. ;) Vous devez donc savoir comment résoudre ce problème.

à Roman M:

Tout d’abord, le gars qui pose la question vient de commencer un cours de programmation et n’a probablement pas encore appris à connaître les indicateurs. Deuxièmement, vous avez maintenant affaire à un compteur et à un pointeur. Je ne suis pas sûr de voir l'intérêt de le faire par rapport à l'utilisation d'un index comme celui-ci:

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

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

}

En utilisant une boucle for, vous pouvez éliminer le code de vérification idx-1 , très complexe:

/* 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;
}

Les tableaux C commencent à compter à partir de 0.

Si vous allouez un tableau de taille MAX, accéder à l'élément en MAX serait une erreur. Changez la boucle en;

int arr[MAX];
for ( .... && idx < MAX )

Dans votre première boucle While, le

arr[idx] <= MAX

ligne devrait lire

idx <= MAX

Dans votre deuxième boucle, vous incrémentez idx avant le test - il devrait se terminer par

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

J'ai aussi tendance à mettre toutes les conditions internes entre parenthèses pour être absolument sûr que la priorité est correcte (d'où les crochets supplémentaires ci-dessus).

J'irais avec quelque chose comme ça.

Vous n'avez pas à vous soucier des limites du tableau et d'autres conditions prêtant à confusion.

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top