2016-06-11 7 views
0

チック・タック・トー・ゲームをcで作ろうとしているうちに、混乱してしまいます。私はボードを作成するために8つの要素からなる1つのchar配列を使用する本に従っています。私は配列[8]に9要素が含まれていることを知っていますが、配列がchar配列として宣言されている場合、空のボードをゲームに使うためのスペースが必要であるため、配列[9] 9文字とヌル文字 '\ 0'を含んでいますか?私はボードが2次元配列に変換されるときに同じ疑問を抱いています。なぜなら、ボードは配列[3] [3]で作られなければならないと理解しているからですが、それをcharとして宣言したい場合、ヌル文字ですか?チック・タック・トー・ゲームで2dキャラクター・アレイを初期化する

+0

あなたは文字列とchar配列の違いを知っていればあなたはそれを考え出しただろう。 – wrangler

+0

8文字の配列には8文字が含まれます。あなたはCスタイルの文字列を参照しているときに、char * str = "hello"と言っています。それは余分な '\ 0'のために余裕を残すことを心配する必要があるときです。 – StaticBeagle

+0

"配列[8]に9要素が含まれています"いいえ、それは8つの要素を含んでいます。あなたは何を信じていますか? –

答えて

0

文字列の格納に文字配列を使用する場合は、終了ゼロが必要です。

タスクの場合、配列に文字列を格納する必要はありません。

だから、Cで、あなたはそれが文字列リテラルで初期化されているものの、配列の各要素は終了ゼロは含まれません3 * 3配列に、たとえば次のよう

​​

を宣言してもよいです。

一方、このような配列を出力する方が簡単であると思われる場合は、各要素に終端ゼロを含めることができます。この場合、配列は、配列が正確に8を持つように宣言されて

配列は、[8] 9つの要素

が含まれていることを、あなたの文のよう

char board[3][4] = 
//   ^^^ 
{ 
    " ", // three spaces 
    " ", 
    " " 
}; 

のように定義されるべきです要素。 :) 私はあなたが文字列リテラルを意味すると思います。例えば、Cの文字列リテラル"Hi"は、リテラルに格納されている終端ゼロのためにタイプchar[3]です。

0

2D配列は基本的に1D配列であり、プログラマにとって使い易いものです。あなたが読んだ本はおそらく、セルに値を格納し、あなたが言ったように文字列の文字の代わりにそれらを表示します。これはボード全体を文字列として保存するよりも少し効率的です。

4x4領域の2D配列を保存するとします。あなたはサイズ16、及びそのようなアクセスなインデックスの1次元配列として、それを表現することができます。あなたはその4単位ブロックのどこにいるかjは、と私はあなたが何であるかを4単位ブロックである

arr[j + i * 4] 

また、サイズ[8]の配列には8つの要素があります。例:

char arr[8]; // has 8 elements, not 9 
0

私は配列[8]は9つの要素

いいえ、それがあるべき理由が含まれています知っていますか? int arry[8]のように定義された配列には、8要素しか含まれていません。 Cでも配列のインデックスは0を基準にしているので、上記のような配列の場合はarray[0]からarray[7]までが有効なアクセスとなります。

charアレイの場合、文字列として使用され、ヌルターミネータのためのスペースも必要です。したがって、charの9要素の配列を持ち、文字列として使用する場合は、char[10]と定義する必要があります。配列の値として文字を使用して

0

charの配列はポインタchar*に減衰することができますし、NUL終了する文字列として解釈されているという事実とは何の関係もありません。

文字列の中に特定の型がありません。これは単なるデータの解釈方法です。あなたは2つのコンセプトをミックスしています。

char配列がNULを終了する必要はありませんが、文字列としてデータを使用する機能でそれを使用しようとしている場合、それはNUL終端が必要です。

char board[3][3]を持つことは完全に合法であり、9文字の要素のための余裕があります。\0は、そのデータを文字列として使用しないため、必要ありません。

1

文字の配列は、任意の位置の任意の値を保持できます。文字列の末尾にNUL文字(0ではなく、'0'!)があることを確認するために必要な特定の関数を使用したいときのみです。この関数はいつ処理を停止するかを指示します。

だから、: - それは0値が見つかるまで、それはカウントを維持しますので、ちょうど、strlen()johnに合格しないと、アレイ内の任意の存在しないchar john[4] = { 'J', 'o', 'h', 'n' };は完全に合法です!また

char tictactoe[3][3];はどこでも0を必要としない - あなたには、いくつかの理由でprintf()全体配列を渡ししようとしない限り...あなたは安全に次の操作を行うことができます

注:

printf(" %c | %c | %c \n", tictactoe[0][0], tictactoe[0][1], tictactoe[0][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[1][0], tictactoe[1][1], tictactoe[1][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[2][0], tictactoe[2][1], tictactoe[2][2]); 

%cを使用すると、「文字列を印刷する」ではなく、「1文字印刷」を意味するためです。

NULで終わる文字列の形式は、ASCIIZ(ASCII-Zeroed)文字列と呼ばれることが多く、9文字の配列には8文字の文字列しか格納できません言った) - それはNULを保持するために9番目の必要があります。

そして、常にCのように、任意の配列は、長さが0から1になると、私の例では、したがって[0][1][2]

関連する問題