C-将3D字符数组传递给函数

C-将3D字符数组传递给函数,c,string,multidimensional-array,C,String,Multidimensional Array,我正试图编写一个程序来分析用户提供的字符串(3 x 4)矩阵。最终,它需要输出矩阵中最长的字符串以及该字符串的长度 根据判断,我的程序似乎正确地读取了输入,成功地回显了输入字符串,但它没有正确地输出最长的单词。我确信当我传递最长单词的值时,我犯了某种与指针相关的错误,但我不知道如何解决它 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 4 #define

我正试图编写一个程序来分析用户提供的字符串(3 x 4)矩阵。最终,它需要输出矩阵中最长的字符串以及该字符串的长度

根据判断,我的程序似乎正确地读取了输入,成功地回显了输入字符串,但它没有正确地输出最长的单词。我确信当我传递最长单词的值时,我犯了某种与指针相关的错误,但我不知道如何解决它

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define M 4
#define N 5
#define MAX_DIM 20

void findMAX(char matrice[N][M][MAX_DIM]) {
   char maxr;
   int index;
   int i, j, it;

   index = 0;
   maxr = *(*(*(matrice+0)+0)+MAX_DIM);

   for (i = 0; i < N-1; i++) {
      for (j = 0; j < M-1; j++) {
         if (index < strlen(matrice[i][j])) {
            index = strlen(matrice[i][j]);

            // I save the longer line's value            
            it = i;

            // I save the maximum's value
            maxr = *(*(*(matrice+i)+j)+MAX_DIM);
         }
      }
   }

   printf ("The MAX is: -/%s/- and it's long: -/%d/- \n", maxr, index);
   printf ("It is content in the: %d line, which is: \n", it);
   for (j = 0; j < N-1; j++) {
        printf("%s  ", matrice[it][j]);
   }
}

void leggi(char matrice[N][M][MAX_DIM]) {
    int i, j;

    for (i = 0; i < N-1; i++) {
        for (j = 0; j < M-1; j++) {
            printf ("Insert the element matrix [%d][%d]: ", i, j);
            scanf  ("%s", matrice[i][j]); 
            fflush(stdin);
        }
    }
}

void stampa(char matrice[N][M][MAX_DIM]) {
    int i, j;

    printf("\n(4 x 3) MATRIX\n");
    for (i = 0; i < N-1; i++) {
        for (j = 0; j < M-1; j++) {
            printf("%s ", matrice[i][j]);
        }
        printf("\n\n");
    }
}

int main(int argc, char *argv[]) {
    char matrix[N][M][MAX_DIM]; //Matrix of N*M strings, which are long MAX_DIM

    printf("************************************************\n");
    printf("**   FIND THE LINE WITH THE MAXIMUM ELEMENT   **\n");
    printf("**            IN A (4 x 3) MATRIX             **\n");
    printf("************************************************\n");

    printf ("Matrix Reading & Printing\n");
    leggi  (matrix);
    stampa (matrix);

    findMAX(matrix);

    return 0;
}
#包括
#包括
#包括
#定义M4
#定义n5
#定义最大尺寸20
void findMAX(字符矩阵[N][M][MAX\u DIM]){
char-maxr;
整数指数;
int i,j,it;
指数=0;
maxr=*(*(*(矩阵+0)+0)+MAX\u DIM);
对于(i=0;i
如果在编译时知道次要维度的大小,则可以将多维数组传递给C函数。但是,语法是不可接受的

 void foo( int (*array2d)[6] )
通常在编译时不知道数组维度,因此有必要创建平面数组并通过

   array2D[y*width+x]
一般来说,即使已知数组维度,也更容易使用此方法


为了澄清对注释的响应,C99允许使用更直观的语法传递可变大小的数组。然而,微软Visual C++编译器并不支持这个标准,这意味着你不能在很多实际的应用中使用它。

< P>尝试类似的事情:

void findMAX(char matrice[N][M][MAX_DIM]){
//   char maxr
   char maxr[MAX_DIM];
   int index;
   int i, j, it;

   index = 0;
//   maxr = *(*(*(matrice+0)+0)+MAX_DIM);
   strncpy(maxr, *(*(matrice+0)+0), MAX_DIM);

   for (i = 0; i < N-1; i++)
   {
      for (j = 0; j < M-1; j++)
      {
         if (index < strlen(matrice[i][j]))
         {                   
            index = strlen(matrice[i][j]);
            it = i;
//            maxr = *(*(*(matrice+i)+j)+MAX_DIM);
            strncpy(maxr, *(*(matrice+i)+j), MAX_DIM);
         }
      }
   }

   printf ("The MAX is: -/%s/- and it's long: -/%d/- \n", maxr, index);
   printf ("It is content in the: %d line, which is: \n", it);
//   for (j = 0; j < N-1; j++){
   for (j = 0; j < M-1; j++){   
        printf("%s  ", matrice[it][j]);
   }
}
void findMAX(字符矩阵[N][M][MAX\u DIM]){
//字符最大值
字符最大值[MAX_DIM];
整数指数;
int i,j,it;
指数=0;
//maxr=*(*(*(矩阵+0)+0)+MAX\u DIM);
strncpy(maxr,*(*(矩阵+0)+0),MAX_DIM);
对于(i=0;i<>代码>首先解决另一个答案所传达的一些误解,请将你的3D数组声明为

char matrix[N][M][MAX_DIM];
,其中
N
M
MAX\u DIM
是扩展为整数常量的宏

  • 这是一个普通数组(不是可变长度数组)
  • 如果要将此数组传递给函数,完全可以使用与声明数组完全相同的方式声明相应的函数参数,正如您所做的那样:
  • 但确实,实际传递的不是数组本身,而是指向其第一个元素的指针(也可以通过它访问所有其他元素。在C中,多维数组是数组的数组,因此三维数组的第一个元素是二维数组。在任何情况下,该函数声明都等效于这两个:

    void findMAX(char (*matrice)[M][MAX_DIM]) 
    
    
    void findMAX(char matrice[][M][MAX_DIM]) 
    
    特别要注意的是,第一个维度没有被传达。在这三个等价的形式中,我发现在大多数情况下,最后一个维度是最清晰的

不过,在findMAX()函数中访问数组元素的方式很奇怪。下面是一个典型示例:

        maxr = *(*(*(matrice+i)+j)+MAX_DIM);
但这是一个多么丑陋和令人困惑的表达,尤其是与这个保证等价的表达相比:

        maxr = matrice[i][j][MAX_DIM];
然而,看看它,看看你是如何使用它的,我发现虽然赋值是正确的类型,但你可能使用了错误的类型。
maxr
包含一个
char
。如果你想以某种方式捕获整个字符串的值,那么你需要将它声明为数组(您可以根据需要将字符串的内容复制到其中),或者将其设置为指向感兴趣的字符串的指针。后一种方法效率更高,我认为没有什么建议您使用前一种方法

因此,我认为你想要

    char *maxr;
……后来

        maxr = matrice[0][0];
……还有

        maxr = matrice[i][j];
您应该熟悉这种用法,例如,您的函数
stampo()
;主要区别在于现在您将表达式赋值给变量,而不是直接传递它
        maxr = matrice[i][j];
    printf ("The MAX is: -/%s/- and it's long: -/%d/- \n", maxr, index);