0


0

関数パラメーターとしての配列

私は、非常に限られた言語機能のセットを使用してCで何かを作成し、これまでの情報をそのままにするために、小さなCLI Hangmanゲームを作成しようとしています。

私はまだ本の文字列に到達していないので、いわゆる_dictionary_を作成しました。これは、各行が単語を表し、各列が文字の多次元配列です。 したがって、今日のDictionary.comの今日の単語( "予後予測")を辞書に入れたい場合、次のように書きます。

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

次に、画面に印刷される単語を、最初はアンダースコアで構成された文字の配列として表します。

プレイヤーが文字を入力すると、私が考えていたとおり、現在の単語内に文字が存在するかどうかを確認します。 もしそうなら、 `word []`配列のアンダースコアを実際の文字に置き換えます。 `word []`配列にアンダースコアが残っていないときに単語が推測されると考えます。

最初の考えは、文字が配列内で見つかったかどうかに基づいて0または1を返す関数 `int in_array(char array []、char letter)`を書くことでした。 しかし、それから、 `dictionary [] []`を最初の引数として渡すことができないことがわかりました。 私はこれまでのところ解決策を考え出していないので、2つの関数を使用する必要があります。配列ごとに1つ、または…​ アイデア全体を再考してください。

したがって、これを要約するには、要素が1次元配列または多次元配列のいずれかに存在するかどうかをチェックする関数が必要です。 解決策はありますか? 前もって感謝します!

1 Answer


0


ややジャンキーで辞書全体を渡すことができます

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

i.e. この場合、2D配列の各行の大きさを正確にコンパイラーに伝え、個別のパラメーターとして必要な行を伝えます。 次に、通常の2添え字表記を使用して要素にアクセスします。

この配列の1行を渡すのも簡単です。 2番目の単語を推測しているとしましょう。

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

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

あなたがいる場所の少し先かもしれませんが、「私が欲しい行の最初の文字、2行目(覚えてください:0ベースのインデックス付け!)のメモリ内のアドレスを取得し、それを開始として扱います一次元配列。」

このアプローチで解決する必要がある問題は、単語に含まれる文字数をルーチンに伝えることです。 MAX_CHARSを使用すると、おそらくすべての単語がその長さであるわけではなく、割り当てない文字は_uninitialized_であるため、問題が発生します。つまり 行の最後にごみの文字がたくさんあるかもしれません。そのうちの1つが探しているキャラクターかもしれません。 このための一般的な解決策は、「\ 0」と書かれた0値の文字を各単語の最後に配置することです。これにより、関数はそれを見ると停止することを認識します。 初期化する各単語の末尾にこれを追加する必要があります。また、MAX_CHARSを増やしてスペースを空ける必要がある場合があります。これは、単語内の他のすべての文字と同じです。

はるかに良い解決策は、辞書を文字列の1次元配列に変換することです。

char* dict[MAX_WORDS];

ただし、ポインタと文字列に慣れている必要があるため、準備ができたら戻ってください。