2010-09-03 118 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