web-dev-qa-db-fra.com

Quand devrais-je utiliser l'esperluette avec scanf ()

Quelles sont les règles d'utilisation de esperluette dans c en utilisant scanf()?

struct Student 
{
  char name[20];
  int id;
};

int main(void)
{
  struct Student std1;
  printf("enter name and id of std1\n");
  scanf("%s %d", std1.name, &(std1.id));
}

Pourquoi pour String n'ai-je pas besoin d'utiliser l'esperluette et pour int je dois l'utiliser?

Existe-t-il une règle sur le moment d'utilisation du signe esperluette? 

15
Dkova

scanf lit un type particulier de données dans des adresses qui sont transmises sous forme d'arguments de deuxième, troisième, quatrième et ainsi de suite ...

int var;

ici var est valeur et & var est adresse

scanf("%d",&var);

l'instruction ci-dessus dit ==> lire le type de données% d (entier) dans l'adresse & var 


char s[20];

ici s est adresse pas la valeur. car ici s est un tableau de charte (nous sommes appelés comme chaîne)

le nom du tableau lui-même indique son adresse. s == & s [0] , ils sont identiques.

scanf("%s",s);

l'instruction ci-dessus dit ==> read% s (tableau de caractères) du type de données dans l'adresse, à partir de s.


int a[20];

s'il vous plaît voir ce code 

#include<stdio.h>
#define MAX 5

  main()
    {
        int a[MAX];
        int i;
        printf("Enter Values of array\n");
        for(i=0;i<MAX;i++)
        {
                printf("Enter a[%d] =  ",i);
                scanf("%d",&a[i]); // reading each time single integer value starting index with 0 and ending index MAX-1.
        }

     }

En C Nous ne disposions d'aucun spécificateur de format unique pour analyser un groupe d'entiers à la fois, comme si nous analysions un groupe de caractères à la fois à l'aide de% s.

Et ici a = & a [0];

vous pouvez numériser une seule valeur entière directement à l'adresse indiquée par un. 

scanf("%d",a);

printf("a[0]=%d\n",a[0]);

si vous entrez 10, cela l’affiche a [0] = 10.

Utilisation des pointeurs:

si vous utilisez des pointeurs comme indiqué ci-dessous, vous en arriverez à le savoir. comment incrémenter le pointeur et obtenir les valeurs dans différents emplacements du tableau. 

vous pouvez déplacer l'emplacement du pointeur pour lire des tableaux. vous pouvez lire des tableaux sans déplacer l'emplacement du pointeur.

1.lire des tableaux en déplaçant des emplacements de pointeur

    #include<stdio.h>
    #define MAX 5

      main()
        {
            int a[MAX];
            int i;
            int *ptr;
            ptr = &a[0];
            printf("Enter Values of array\n");
               for(i=0;i<MAX;i++)
                    {
                    printf("Enter a[%d] =  ",i);
                    scanf("%d",ptr);
                    ptr++; //moving pointer 
                    }

        }

Tableaux de lecture sans emplacements de pointeurs mobiles 

#include<stdio.h>
#define MAX 5

  main()
    {
        int a[MAX];
        int i;
        int *ptr;
        ptr = &a[0];
        printf("Enter Values of array\n");
           for(i=0;i<MAX;i++)
                {
                printf("Enter a[%d] =  ",i);
                scanf("%d",ptr+i); //we are not moving ptr position we scaning each time into next location by incrementing i 
                }

    }

lorsque le pointeur est incrémenté, l’incrément dépend du type de pointeur. Ici ptr est un pointeur entier, donc ptr + 1 incrémentera ptr + sizeof (int).


int a[5][5];

c'est un tableau à deux dimensions, vous avez donc besoin de 5 pointeurs pour numériser et j'ai donc été déclaré tableau de pointeurs. 

#include<stdio.h>
#define MAX 5

  main()
    {
    int a[MAX][MAX],i,j;
    int *pointer[MAX];

    for(i=0;i<MAX;i++)
    pointer[i]=&a[i][0]; //initializes the pointers 

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
        {   
        for(j=0;j<MAX;j++)
            {

            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",pointer[i]+j); //each time you will move like 00 01 02 03 04 and second time 10 11 12 13 14 and so on...
            //printf("%u or %x",pointer[i]+j,pointer[i]+j);//un comment this line and see the addresses how the address incrementing for each element
            }
        }

    printf("The Given Matrix:\n\n");
    for(i=0;i<MAX;i++)
                {
                for(j=0;j<MAX;j++)
                        {
                        printf("%d",*(pointer[i]+j));
                        printf("\t\t");
            }
        printf("\n\n");
                }

    }

Balayage direct 

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
        {   
        for(j=0;j<MAX;j++)
            {

            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",&a[i][j]); //we can't do like this a++ or ++a or a+i this is illegal in C. for that purpose we are using pointers  
            }
        }

vous trouverez la plupart des éléments ci-dessus dans le livre ci-dessous. 

s'il vous plaît allez à ce lien: lisez le wiki et lisez
Le langage de programmation C (Deuxième édition) - Brian W. Kernighan et Dennis M. Ritchie

23
Gangadhar

Parce que les chaînes C ont un type de char []. Le nom du tableau a la valeur de son adresse, mais pas une variable int, vous devez utiliser &.

Et c'est faux d'écrire void main, vous devriez toujours utiliser int main.

6
Yu Hao

En C, les chaînes sont des tableaux de caractères (terminés par \0 caractère). 

Le nom du tableau renvoie le pointeur du premier élément d'un tableau (emplacement mémoire où le tableau est stocké) et le nom de la variable scalaire renvoie la valeur du scalaire. Vous devez donc utiliser l'opérateur & pour obtenir l'emplacement vous devez écrire la valeur.

0
Nemanja Boric