2013-08-23 24 views
13

Quali sono le regole per l'utilizzo commerciale in C durante l'utilizzo di scanf()?Quando devo usare e commerciale con scanf()

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

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

Perché for String faccio: non è necessario utilizzare il la e commerciale e per int devo usarlo?

C'è una regola su quando utilizzare il segno commerciale?

+1

Leggi [un tutorial su stringhe C] (http://www.codingunit.com/c-tutorial-strings-and-string-library-functions) – Dariusz

+2

@PP potrebbe sembrare un po 'condiscendente in il suo commento, ma ha assolutamente ragione: leggere prima un buon libro di programmazione C. Il linguaggio di programmazione C di Kernighan e Ritchie è una risorsa eccellente. – SolarBear

+2

@PP ha assolutamente ragione. Non puoi iniziare a scrivere C finché non capisci perché è necessario per una variabile e non l'altra. È come cercare di guidare una macchina senza conoscere la differenza tra acceleratore e freno. –

risposta

21

scanf legge particolare tipo di dati in indirizzi che sono passati come seconda, thrid, fouth ecc argomenti ...

int var; 

qui var viene valore e & var è indirizzo

scanf("%d",&var); 

la dichiarazione di cui sopra dice ==> leggere% d (intero) tipo di dati in indirizzo & var


char s[20]; 

qui s è l'indirizzo non il valore. perché qui è una matrice di noleggio (siamo chiamati come stringa)

nome di matrice indica il suo indirizzo. s == & s [0], entrambi sono uguali.

scanf("%s",s); 

l'istruzione precedente dice ==> leggi% s (matrice di caratteri) tipo di dati nella posizione dell'indirizzo a partire da s.


int a[20]; 

vedere questo codice

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

    } 

In C Noi non abbiamo avuto alcun identificatore di formato unico per la scansione di gruppo di interi in un momento come come gruppo di scansione di personaggi al tempo con la aiuto di% s.

E qui a = & a [0];

è possibile eseguire la scansione di un singolo valore intero direttamente all'indirizzo indicato da a.

scanf("%d",a); 

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

se si immette 10 quindi stampa questo a [0] = 10.

uso di puntatori:

se si utilizza puntatori come mostrato di seguito, poi si verrà a sapere. come incrementare il puntatore e ottenere i valori in diverse posizioni dell'array.

è possibile spostare la posizione del puntatore per leggere gli array. puoi leggere gli array senza la posizione del puntatore in movimento.

1.Reading array spostando destinazioni puntatore

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

     } 

array 2.reading con fuori in movimento riprese puntatore

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

    } 

quando il puntatore incrementato quindi l'incremento dipende dal tipo di puntatore. Qui ptr è un puntatore intero, quindi ptr + 1 incrementerà le posizioni ptr + sizeof (int).


int a[5][5]; 

Si tratta di due matrice bidimensionale in modo avete bisogno di qui 5 puntatori per eseguire la scansione quindi ero dichiarato allineamento puntatore.

#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"); 
       } 

    } 

Scansione diretto

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 
      } 
     } 

si trovano la maggior parte delle cose al di sopra del libro di seguito.

please goto this link : read the wiki and read
The C Programming Language (Second edition) - Brian W. Kernighan and Dennis M. Ritchie

+1

grazie, ma perché quando sto cercando di fare qualcosa di simile: int arr [4] [5]; – Dkova

+0

@Dkova ha modificato la risposta. Otterrete ciò che avete richiesto. – Gangadhar

+1

Grazie! @Gangadhar – Dkova

0

In C, le stringhe sono array di caratteri (terminati con \0 carattere).

Il nome di matrice restituisce il puntatore del primo elemento di una matrice (posizione di memoria in cui è memorizzata la matrice) e il nome della variabile scalare restituisce il valore dello scalare, quindi è necessario utilizzare l'operatore & per ottenere la posizione di memoria di scalare in cui è necessario scrivere il valore.

+0

Sono d'accordo, cambierò la mia risposta per riflettere questo. –

5

Perché stringhe C hanno un tipo di char []. Il nome array ha il valore di esso di indirizzo, ma una variabile int non lo fa, è necessario utilizzare &

Ed è sbagliato a scrivere void main, è necessario utilizzare sempre int main.