2010-08-01 114 views
0

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

所以总结一下,我需要一个函数来检查元素是否存在于一维或多维数组中。任何解决方案提前致谢!

+2

二维数组是一个指向数组的指针 - 所以如果它需要一个类型为“char **”的参数,可以将它传递给一个函数。但是,如果你知道当前的单词,你能不能通过'dictionary [currentWordIndex]'? – sje397 2010-08-01 15:57:57

+4

@ sje397:不!二维数组不是指向数组的指针,它是一个数组数组。像所有数组一样,当它传递给函数时,它会衰减到指向其第一个元素的指针,但这种类型是指向数组的指针,而不是指向指针的指针。 'char(*)[MAX_CHARS]'与'char **'不是同一个类型。 – 2010-08-01 16:03:58

+0

您可以返回单词中的匹配位置。如果有两个以上的匹配,你必须重新考虑这个解决方案。你可以在问题中显示匹配的字母,方法是传递问题的引用,并在解析字母匹配字母时更新它。 – 2010-08-01 17:06:27

回答

0

您可以通过稍微janky

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

即通过整个字典告诉编译器的二维数组的每一行究竟有多大这种情况下,和哪一行,你想作为一个单独的参数。然后,使用通常的2脚标记来访问元素。

传递这个数组的一行也很容易。比方说,你在第二个字做猜测:

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

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

这可能是有点超前的你在哪里,但是他说,“把地址我想该行中第一个字符的内存,第二行(记住:基于0的索引!),并将其视为一维数组的开始。“

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

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

char* dict[MAX_WORDS]; 

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

+0

我已经注意到这个词的长度。我有一个独立的功能:-)我知道我需要更多的语言知识才能完成我想要的功能,所以现在我会坚持两个不同的指针,并且,正如你所建议的那样,我我准备好后会回来。 – XLR3204S 2010-08-01 17:21:05

+1

你对未初始化的位置错了。在C中没有这样的事物作为部分初始化的对象;如果它有任何初始化器,那么未明确初始化的部分被初始化为零。因此'{0}'是一个通用的零初始化器,可以用于任何对象。 – 2010-08-01 18:21:36

+0

在这种情况下,'&(dict [1] [0])''是写'dict [1]'的有趣方法。 – caf 2010-08-01 22:15:54