Pourquoi je dois passer des tableaux comme des variables dans la fonction scanf("%type",&array[x]), pas scanf("%type",array[x]), je pense qu'ils sont censés être des pointeurs "des pointeurs spéciaux qui ne peuvent pas pointer vers une autre adresse". Si je me trompe, j'espère que quelqu'un peut me clarifier.

Une autre chose a deux codes simples ici. quel est le meilleur ? Je suis intéressé par le codage propre, mais je suis toujours débutant.

for(_a_i = 0; _a_i < _a_size; _a_i++) {

    int _a_item;
    scanf("%d", &_a_item);
   _a[_a_i] = _a_item;

}

Un autre

for(_a_i = 0; _a_i < _a_size; _a_i++) {

            scanf("%d", &_a[_a_i]);

       }
1
user6398437 16 janv. 2017 à 16:56

2 réponses

Meilleure réponse

Pourquoi dois-je passer des tableaux comme des variables dans la fonction scanf("%type",&array[x]), pas scanf("%type",array[x]), ...?

Bien que array soit un tableau . L ' opérateur indice [] désigne un élément du tableau array[x].

Supposons que array[x] est un int. &array[x] est alors l'adresse d'un int, d'un seul int.

La question devient alors

Pourquoi dois-je passer l'adresse d'une fonction int dans scanf("%type",&array[x]), pas une int comme dans scanf("%type",array[x]), ...?

scanf() doit connaître l ' adresse de l'emplacement de stockage de la conversion du texte d'entrée vers int. Tous les arguments d'une fonction sont reçus par valeur.

Supposons array[x] = 42; avant l'appel de la fonction. Transmettre la valeur d'un int, comme dans scanf("%type",array[x]) ne fournirait pas scanf() d'informations sur l'emplacement de stockage de la conversion. Ce serait la même chose que scanf("%type", 42), qui ne fournit certainement aucune information pour stocker le résultat dans array[x].


Concernant le "codage propre". Les deux extraits de code ne vérifient pas le résultat de scanf() - une lacune importante. Sans ce code de contrôle ne sait pas de succès de la numérisation.

if (scanf("%d", &_a[_a_i]) != 1) Handle_Error_or_EOF().

Selon la gestion des erreurs, il peut être préférable d'obtenir les données en premier, avant de détruire la valeur précédente dans _a[_a_i]

int x;
if (scanf("%d", &x) != 1) Handle_Error_or_EOF().
else _a[_a_i] = x;

Dans les cas de style , il est préférable de coder selon les normes de codage de votre groupe.

0
chux - Reinstate Monica 16 janv. 2017 à 16:57

Remarque

Cela dit, concernant les extraits,

  • les deux sont sujets aux erreurs car vous n'avez jamais vérifié la valeur renvoyée de scanf() pour garantir la sécurité.
  • tous les identifiants commençant par un trait de soulignement sont censés être réservés, n'essayez pas de les utiliser inutilement.

    Citant C11, chapitre §7.1.3, Identifiants réservés

    • Tous les identifiants commençant par un trait de soulignement et une lettre majuscule ou une autre Les traits de soulignement sont toujours réservés pour toute utilisation.

Remarque:

Citant C11, chapitre §6.3.2.1, ( c'est moi qui souligne )

Sauf lorsque il s'agit de l'opérande de l'opérateur sizeof, de l'opérateur _Alignof ou du opérateur unaire &, ou est une chaîne littérale utilisée pour initialiser un tableau, une expression qui a le type ‘‘ tableau de type ’’ est converti en une expression de type ‘’ pointer to type ’’ qui pointe à l'élément initial de l'objet tableau et n'est pas une lvalue. [...]

1
Sourav Ghosh 16 janv. 2017 à 14:12