Массивы как параметры функции - PullRequest
0 голосов
/ 01 августа 2010

Я пытаюсь написать небольшую игру CLI Hangman, просто чтобы создать что-то на C, используя мой очень ограниченный набор языковых функций, чтобы информация до сих пор оставалась неизменной.

У меня нет строкв книге еще нет, поэтому я создал так называемый словарь , который представляет собой многомерный массив символов, каждая строка представляет слово, а каждый столбец - букву.Поэтому, если я хочу поместить в словарь сегодняшнее слово дня Dictionary.com («prognosticate»), я напишу что-то вроде

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 голосов
/ 01 августа 2010

Вы можете передать весь словарь через несколько неуклюжий

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

, т. Е. Точно указав компилятору, насколько велика каждая строка 2D-массива в этом случае, и какую строку вы хотите использовать в качестве отдельного параметра.,Затем вы используете обычную двухстрочную запись для доступа к элементам.

Для прохождения одной строки этого массива тоже легко.Допустим, вы угадаете второе слово:

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

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

, которое может быть немного впереди вашего, но говорит: «возьмите адрес в памяти первого символа в строке, которую я хочу, вторая строка (помните: индексирование на основе 0!), и рассматривайте его как начало одномерного массива. "

Проблема, которую необходимо решить с помощью этого подхода, заключается в указании подпрограмме, сколько символовв твоем слове.Если вы используете MAX_CHARS, у вас есть проблема, потому что, вероятно, не каждое слово имеет такую ​​длину, а символы, которые вы не присваиваете, неинициализирован ;то есть у вас может быть куча символов мусора в конце вашего ряда, одним из которых может быть даже персонаж, которого вы ищете!Обычное решение для этого состоит в том, чтобы поставить 0-значный символ, написанный '\ 0', в конце каждого слова, чтобы функция знала, что остановить, когда увидит его.Вам нужно будет добавить это в конец каждого слова, которое вы инициализируете, и вам может понадобиться увеличить MAX_CHARS, чтобы освободить место для него, потому что это символ, похожий на все остальное в вашем слове.

Гораздо лучшим решением будет превратить ваш dict в одномерный массив строк, то есть

char* dict[MAX_WORDS];

, но для этого нужно, чтобы вы были знакомы с указателями и строками, поэтому вернитесь к нему, когда будете готовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...