2010-09-03 119 views
0

我有問題與第三個功能(GetMatrix)其他人的作品。 我想poiters只矩陣使用指針

線從用戶數據趕入矩陣:

typedef int pArr[COLS]; 

void GetMatrix(pArr* ,int , int); 

M[ROWS][COLS]; 

是制約

我需要怎麼做掃描,我嘗試使用scanf("%d",*(M+cols*i+j)) 但我得到error..its可能是錯的 什麼是需要做的,作出正確的

THX所有

的代碼:

#pragma warning (disable: 4996) 
#include <stdio.h> 
#include <string.h> 
#define ROWS 2 
#define COLS 3 

typedef int pArr[COLS]; 

void MergeStrings(char* str1,char* str2,char* strRes); 
void StrReverse(char* strRes,char* strRev); 
void GetMatrix(pArr* M ,int rows , int cols); 

void main() 
{ 
char str1[256],str2[256],strRes[256],strRev[256]; 
int M[ROWS][COLS]; 

printf("Please enter first string:\n"); 
flushall(); 
gets(str1); 
printf("\nPlease enter second string:\n"); 
flushall(); 
gets(str2); 

printf("\nMerge of: %s\n",str1); 
printf("with: %s\n",str2); 

MergeStrings(str1,str2,strRes); 

StrReverse(strRes,strRev); 

printf("is:\n"); 
printf("==> %s\n",strRes); 

printf("\nthe reversed merged string is:\n"); 
printf("==> %s\n\n",strRev); 

GetMatrix(M,ROWS,COLS); 
} 

void MergeStrings(char* str1,char* str2,char* strRes) 
{ 
int i=0,j=0,a=0,flag=0,flag2=0; 

do 
{ 

    while(*(str1+i)==' ') 
    i++; 

    while(*(str2+j)==' ') 
    j++; 

    while(*(str1+i)!=' ' && *(str1+i)!='\0') 
    { 
    *(strRes+a)=*(str1+i); 
    i++; 
    a++; 
    } 

    if(flag!=1) 
    { 
    *(strRes+a)=' '; 
    a++; 
    } 

    if(*(str1+i)=='\0') 
    flag=1; 

    while(*(str2+j)!=' ' && *(str2+j)!='\0') 
    { 
    *(strRes+a)=*(str2+j); 
    j++; 
    a++; 
    } 

    if(flag2!=1) 
    { 
    *(strRes+a)=' '; 
    a++; 
    } 

    if(*(str2+j)=='\0') 
    flag2=1; 

}while((*(str1+i)!='\0') || (*(str2+j)!='\0')); 

*(strRes+a)='\0'; 

} 

void StrReverse(char* strRes,char* strRev) 
{ 
int size,i=0,j=0; 
size=strlen(strRes); 

for(i=size-2 ; i>=0 ;i--) 
{ 
    *(strRev+j)=*(strRes+i); 
    j++; 
} 

*(strRev+size-1)='\0'; 

} 
void GetMatrix(pArr* M ,int rows , int cols) 
{ 


} 
+0

你得到的錯誤是什麼? – Gian 2010-09-03 14:55:58

回答

0
#define ROWS 2 
#define COLS 3 
typedef int pArr[COLS]; 
void GetMatrix(pArr* M ,int rows , int cols) 
{ 
    for(int i = 0; i < rows; i++) 
    for(int j = 0; j < cols; j++) 
     scanf("%d", &(M[i][j])); 
} 

int main() 
{ 
    int M[ROWS][COLS] = {{100, 101, 102},{103, 104, 105}}; 
    printf("before\n"); 
    for(int i = 0; i < ROWS; i++){ 
     for(int j = 0; j < COLS; j++) 
      printf("%d ", M[i][j]); 
     printf("\n"); 
    } 
    printf("enter values\n"); 
    GetMatrix(M, ROWS, COLS); 
    printf("after\n"); 
    for(int i = 0; i < ROWS; i++){ 
     for(int j = 0; j < COLS; j++) 
      printf("%d ", M[i][j]); 
     printf("\n"); 
    } 
} 

輸出:

before 
100 101 102 
103 104 105 
enter values 
0 1 2 3 4 5 
after 
0 1 2 
3 4 5 

該函數內部,M是指向的三個整數數組。 M[i]是第i個數組,而M[i][j]是第i個數組中的第j個元素。 &運算符將其地址提供給scanf,它將愉快地將讀取的數字存儲在那裏。

這裏是當你與scanf("%d",*(M+cols*i+j))替換scanf("%d", &(M[i][j]));會發生什麼:

for(int i = 0; i < rows; i++) 
    for(int j = 0; j < cols; j++) 
     scanf("%d", *(M + cols * i + j)); 

剪斷..

before 
100 101 102 
103 104 105 
enter values 
0 1 2 3 4 5 
after 
0 101 102 
1 104 105 
  • 在內部循環的第一次迭代中,i和j是零, *(M+cols*i+j)變成*M。由於M是一個指向數組的指針,因此取消引用會爲您提供一個整數數組,它將衰減爲指向整數的指針。因此,第一個號碼被存儲在正確的地方。
  • 在內循環的第二次迭代中,j是1.因此,它是*(M + 1)。指針算術在這裏出現。由於M是一個指向三個整數數組的指針,因此(M + 1)是指向指向第二個數組的三個整數數組的指針;解引用它給出數組,它衰變成指針,scanf在那裏寫第二個數字。
  • 在第三次迭代中,j是2並且指向第三個(不存在的)數組,並且scanf將輸入的數字寫入堆棧中的存儲器位置,從而破壞堆棧。
  • 等等等等。它試圖寫入每個第三個整數位置,使我們的初始化值(101,102,104,105)保持不變。

如果你想它的指針,你可以投M爲指針,以詮釋爲:

scanf("%d", (int*)M + cols * i + j); 

一旦你投中號爲int*,指針運算增加1 * sizeof(int)的起點位置而不是1 * sizeof(array of three ints),從而給出了預期的結果。


更新 - 回覆我在Facebook上收到的評論。

考慮片段:

int a = 10; 
scanf("%d", &a); 
printf("%d", a); 

SCANF存儲在指定的地址輸入值 - 因此,我們傳遞一個指針爲int作爲參數。 printf打印傳遞的值 - 因此我們傳遞一個int作爲參數。這裏也適用相同的區別。 ((int*)M + cols * i + j)類型爲int*,指向一個整數。要在該位置打印整數,我們應該使用*運算符對其進行解引用。因此,它變成了:

printf("%d\t",*((int*)M + cols * i + j)); 

哦,順便說一下,你會收到一個更快,如果你已經在這裏發佈自己你的疑惑,而不是我的FB的答覆。有很多好的人準備好幫助他們出去玩 - 我只在週末檢查FB。

+0

但我有約束不使用[]它必須只是與指針 – eliran 2010-09-03 15:19:03

+0

@eliran看到更新 – Amarghosh 2010-09-03 15:50:12

+0

謝謝!!!!!非常!! – eliran 2010-09-03 16:34:50

0

是你的意思?

int GetMatrix(pArr* M ,int rows , int cols) 
{ 
    return 1==scanf("%d",&M[rows][cols]); 
} 
+0

沒有我不能改變它爲int – eliran 2010-09-03 15:11:51

+0

不,我不能改變的功能爲int 其需要作廢 – eliran 2010-09-03 15:12:28

+0

我有約束不使用[]它必須是公正與指針 – eliran 2010-09-03 15:39:10