【问题标题】:Passing 2d array char into function将二维数组 char 传递给函数
【发布时间】:2012-10-23 15:23:38
【问题描述】:

我正在尝试将一个包含字符串的二维数组传递给一个函数。我不断得到 ] 标记之前的预期表达式。

这段代码的重点是阅读一个单词搜索谜题,然后找到该谜题中的单词。我要写一个函数,用于向前搜索、反向搜索,然后是向上和向下搜索。

如何消除此错误?错误在我调用 forward 函数的最底部。

    /*Andrea Hatfield CPE 101 October 31st, 2012*/
    #include <stdio.h>
    #include <string.h>

    int forward(char words[][8], char puzzle[][11]);


    int main()
    {
    char puzzle[11][11];
    char words[8][8];
    FILE *fin, *fwords;
    int i = 0;
    int j= 0;

    fin = fopen("puzzle.in", "r"); 
    fwords = fopen("words.in", "r");


    if(fin == NULL) /*Reads in the puzzle file*/
    printf("File does not exist");
    else
    {
            while(fscanf(fin,"%s", puzzle[i])!=EOF)
            {
                    printf("%s\n", puzzle[i]);
                    i++;
            }


    }

    if(fwords == NULL) /*Reads in the words the puzzle will search for */
    printf("File does not exist");
    else
    {
            while(fscanf(fwords, "%s", words[j])!=EOF)
            {
                    printf("%s\n", words[j]);
            }
    }


    forward(&words[][8], &puzzle[][11]); /*Error at this point*/
    return(0);
    }

【问题讨论】:

  • 欢迎来到 Stackoverflow,您能否提供一个明确的问题?

标签: c string function 2d


【解决方案1】:

得到你想要做的事情有点困难,但这里有一个问题:

forward(&words[][8], &puzzle[][11]);

试试这个:

forward(words, puzzle);

here 中应该提到的其他两个选项:

#define ROWS 4
#define COLS 5

void func(int array[ROWS][COLS]) {
  int i, j;

  for (i=0; i<ROWS; i++) {
    for (j=0; j<COLS; j++) {
      array[i][j] = i*j;
    }
  }
}

void func_vla(int rows, int cols, int array[rows][cols]) {
  int i, j;

  for (i=0; i<rows; i++) {
    for (j=0; j<cols; j++) {
      array[i][j] = i*j;
    }
  }
}

int main() {
  int x[ROWS][COLS];

  func(x);
  func_vla(ROWS, COLS, x);
}

【讨论】:

    【解决方案2】:

    需要直接调用

     forward(words, puzzle);
    

    但是,您的代码中有一个错误:您在读取 ​​words 时在读取周期中忘记了 j++,因此您将覆盖 words[0] 而没有初始化数组的其他成员。

    此外,在实际情况下,您可能会发现在运行时选择数组大小是可取的。一个简单的方法是为宽度和高度选择一个相当大的限制,并使用 0x90 的解决方案(您需要一个 30x20 的拼图,并且您可以轻松处理它,因为您使用 ROWS 和 COLS 进行编译,例如, 1024)。

    更复杂的方法是使用malloc()(使用指向字符指针的指针)并动态分配两个数组,受可用内存的限制;然后将它们的尺寸传递给forward 函数。

    int forward(char **words, char **puzzle, size_t w_w, size_t w_h, size_t p_w, size_t p_h)
    {
    
    }
    

    然而,考虑到对malloc()的循环调用以及每次都需要检查其返回值以拦截内存不足的情况,分配部分会更加复杂;此外,在某些情况下,您可能希望内存被de分配(例如运行重复的谜题),这会导致进一步的复杂性。

    【讨论】:

    • 不同意这篇文章的后半部分,这使得代码无缘无故变得更加复杂。原来的设计很好。如果需要,您可以将数组维度作为额外参数传递。
    • 对不起,@M.M,但是……这不是我建议的吗? 从外部提供它们 正是这个意思,将尺寸作为额外参数传递。由于有两个数组(单词和拼图),我需要四个额外的参数。我承认我允许矩形拼图;对于方形的,你只需要一半的参数:-)
    • 您还建议更改为传递指针到指针并使用 malloc(我不是,只是传递维度并保留分配数组的现有方法)
    • @MM,我明白了。是的,这可能被认为是额外的复杂性。我没有想到。我将相应地改写答案;谢谢!
    猜你喜欢
    • 2020-11-01
    相关资源
    最近更新 更多