数组作为函数参数

时间:2010-08-01 15:54:32

标签: c arrays function

我正在尝试编写一个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[][]作为第一个参数传递给它。到目前为止我还没有想出解决方案,所以我必须使用两个函数,每个数组一个,或者......重新考虑整个想法。

总而言之,我需要一个函数来检查元素是否存在于一维或多维数组中。有解决方案吗提前谢谢!

1 个答案:

答案 0 :(得分:0)

你可以通过有点笨拙的

传递整个字典
void foo(char dict[][MAX_CHARS], int whichWord);

即。通过告诉编译器确切地说在这种情况下2D阵列的每一行有多大,以及您想要哪一行作为单独的参数。然后使用通常的2-subscript表示法来访问元素。

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

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

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

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

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

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

char* dict[MAX_WORDS];

但这要求你对指针和字符串感到满意,所以当你准备好时再回过头来。