2013-08-23 44 views
13

Quy tắc sử dụng ký hiệu và trong c khi sử dụng scanf() là gì?Khi nào tôi nên sử dụng dấu và với 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)); 
} 

Tại sao chuỗi không cần sử dụng ký hiệu và cho int Tôi phải sử dụng?

Có quy tắc về thời điểm sử dụng dấu và không?

+1

đọc [một hướng dẫn về chuỗi C] (http://www.codingunit.com/c-tutorial-strings-and-string-library-functions) – Dariusz

+2

@PP có vẻ một chút chiếu cố trong bình luận của anh ấy nhưng anh ấy hoàn toàn đúng: đọc một cuốn sách lập trình C tốt đầu tiên. Kernighan & Ritchie _ Ngôn ngữ lập trình C là một tài nguyên tuyệt vời. – SolarBear

+2

@PP hoàn toàn đúng. Bạn không thể bắt đầu viết C cho đến khi bạn hiểu tại sao & là cần thiết cho một biến và không phải là biến khác. Nó giống như cố gắng lái xe mà không biết sự khác biệt giữa van tiết lưu và phanh. –

Trả lời

21

scanf đọc loại dữ liệu cụ thể vào địa chỉ được thông qua như là thứ hai, thrid, fouth và vân vân luận ...

int var; 

đây var được giá trị và & var là địa chỉ

scanf("%d",&var); 

tuyên bố ở trên nói ==> đọc% d (số nguyên) loại dữ liệu thành & địa chỉ var


char s[20]; 

đây s là địa chỉ không phải là giá trị. vì đây là một mảng điều lệ (chúng tôi được gọi là chuỗi)

chính tên mảng cho biết địa chỉ của nó. s == & s [0], cả hai đều giống nhau.

scanf("%s",s); 

tuyên bố ở trên nói ==> đọc% s (mảng ký tự) loại dữ liệu vào vị trí địa chỉ bắt đầu từ s.


int a[20]; 

xin vui lòng xem mã này

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

    } 

Trong C Chúng tôi không có bất kỳ specifier định dạng duy nhất để quét nhóm các số nguyên tại một thời điểm như như nhóm chức năng quét của nhân vật lúc với trợ giúp của% s.

Và tại đây a = & a [0];

bạn có thể quét giá trị số nguyên duy nhất trực tiếp đến địa chỉ được chỉ bằng a.

scanf("%d",a); 

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

nếu bạn nhập 10 thì in này [0] = 10.

Sử dụng con trỏ:

nếu bạn sử dụng con trỏ như hình dưới đây, sau đó bạn sẽ đến để nhận biết. làm thế nào để tăng con trỏ và nhận được các giá trị vào các vị trí khác nhau của mảng.

bạn có thể di chuyển vị trí con trỏ để đọc mảng. bạn có thể đọc các mảng với vị trí con trỏ di chuyển.

mảng 1.reading bằng cách di chuyển con trỏ địa điểm

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

     } 

mảng 2.reading với ra di chuyển địa điểm con trỏ

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

    } 

khi con trỏ tăng lên thì tăng phụ thuộc vào loại con trỏ. Ở đây ptr là số nguyên con trỏ để ptr + 1 sẽ tăng ptr + sizeof (int) địa điểm.


int a[5][5]; 

đây là hai mảng chiều, do đó bạn cần 5 con trỏ vào đây để quét mảng con trỏ vì vậy tôi đã được công bố.

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

    } 

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

bạn sẽ tìm thấy hầu hết những thứ trên trong cuốn sách dưới đây.

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

+1

cảm ơn, nhưng tại sao khi tôi đang cố gắng làm một cái gì đó như thế này: int arr [4] [5]; – Dkova

+0

@Dkova Đã chỉnh sửa câu trả lời. Bạn sẽ nhận được những gì bạn yêu cầu. – Gangadhar

+1

Cảm ơn! @Gangadhar – Dkova

0

Trong C, chuỗi là mảng ký tự (được kết thúc bằng \0 ký tự).

Tên mảng trả về con trỏ của phần tử đầu tiên của mảng (vị trí bộ nhớ trong đó mảng được lưu trữ) và tên của biến vô hướng trả về giá trị của vô hướng, vì vậy bạn cần sử dụng toán tử & để nhận vị trí bộ nhớ của vô hướng mà bạn cần phải viết giá trị.

+0

Tôi đồng ý, tôi sẽ thay đổi câu trả lời của tôi để phản ánh điều này. –

5

Vì chuỗi C có loại char []. Tên mảng có giá trị của địa chỉ của nó, nhưng một biến int không, bạn cần phải sử dụng &

Và đó là sai lầm khi viết void main, bạn nên luôn luôn sử dụng int main.