【问题标题】:Arrays as function parameters数组作为函数参数
【发布时间】:2010-08-01 15:54:31
【问题描述】:

我正在尝试编写一个小的 CLI Hangman 游戏,只是为了使用我非常有限的一组语言功能在 C 中创建一些东西,使到目前为止的信息保持不变。

我还没有到书中的字符串,所以我创建了一个所谓的字典,它是一个多维字符数组,每一行代表一个单词,并且每列一个字母。因此,如果我想将今天 Dictionary.com 的当日单词(“预测”)放入字典中,我会写类似

dictionary[MAX_WORDS][MAX_CHARS] = {
     ...
     {'p', 'r', 'o', 'g', 'n', 'o', 's', 't', 'i', 'c', 'a', 't', 'e'},
     ...
}

接下来,我将要在屏幕上打印的单词表示为一个字符数组,最初由下划线组成。

我的想法是,当玩家输入一个字母时,我会检查它是否存在于当前单词中。如果是这样,我将word[] 数组中的下划线替换为实际字母。当word[] 数组中没有下划线时,我认为该词被猜到了。

首先想到的是编写一个函数int in_array(char array[], char letter),它会根据是否在数组中找到字母来返回0或1。但后来我发现我不能将dictionary[][] 作为第一个参数传递。到目前为止,我还没有找到解决方案,所以我必须使用两个函数,一个用于每个数组,或者......重新考虑整个想法。

所以总结一下,我需要一个函数来检查一个元素是否存在于一维或多维数组中。有什么解决办法吗?提前致谢!

【问题讨论】:

  • 二维数组是一个指向指针数组的指针——因此,如果它采用char ** 类型的参数,您可以将其传递给函数。但是如果你知道当前的单词,你就不能通过dictionary[currentWordIndex]吗?
  • @sje397:不!二维数组不是指向指针数组的指针,而是数组数组。像所有数组一样,它在传递给函数时衰减为指向其第一个元素的指针,但这种类型是指向数组的指针,而不是指向指针的指针。 char (*)[MAX_CHARS]char ** 的类型不同。
  • 可以返回匹配在单词中的位置。如果有两个以上的匹配,你必须重新考虑这个解决方案。您可以通过传递对问题的引用并在解析与字母匹配的单词时更新它,从而在问题中显示匹配的字母。

标签: c arrays function


【解决方案1】:

您可以通过有点 janky 传递整个字典

void foo(char dict[][MAX_CHARS], int whichWord);

即在这种情况下,通过告诉编译器 2D 数组的每一行有多大,以及您希望将哪一行作为单独的参数。然后使用通常的 2 下标符号来访问元素。

传递这个数组的一行也很容易。假设您正在猜测第二个单词:

void foo(char[] word, int numChars);

foo(&(dict[1][0]), MAX_CHARS);

这可能比您所在的位置稍早,但会说“在我想要的行中的第一个字符的内存中获取地址,第二行(记住:基于 0 的索引!),并将其视为一维数组的开始。”

您需要用这种方法解决的问题是告诉常规您的单词中有多少个字符。如果你使用 MAX_CHARS 你会遇到问题,因为大概不是每个单词都是那个长度,而且你没有分配的字符是未初始化的;即,您的行尾可能有一堆垃圾字符,其中一个甚至可能是您正在寻找的字符!对此的习惯解决方案是在每个单词的末尾放置一个 0 值字符,写为 '\0',以便函数在看到它时知道停止。您需要将此添加到您正在初始化的每个单词的末尾,并且您可能还需要增加 MAX_CHARS 以为其腾出空间,因为它与您单词中的其他所有字符一样。

一个更好的解决方案是将你的 dict 变成一个一维的字符串数组,即

char* dict[MAX_WORDS];

但这需要你熟悉指针和字符串,所以当你准备好后再回来。

【讨论】:

  • 我已经处理了单词的长度。我有一个单独的功能:-) 我知道我需要更多的语言知识才能完成我想要的,所以现在,我将坚持使用两个不同的指针,并且,正如你所建议的,我等我准备好了再回来。
  • 你对未初始化的位置是错误的。 C 中没有部分初始化的对象。如果它有任何初始化程序,则未显式初始化的部分将初始化为零。因此{0} 是一个通用的零初始化器,可用于任何对象。
  • 还值得指出的是,&(dict[1][0]) 在这种情况下只是一种有趣的写作方式dict[1]
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2010-12-15
相关资源
最近更新 更多