チック・タック・トー・ゲームをcで作ろうとしているうちに、混乱してしまいます。私はボードを作成するために8つの要素からなる1つのchar配列を使用する本に従っています。私は配列[8]に9要素が含まれていることを知っていますが、配列がchar配列として宣言されている場合、空のボードをゲームに使うためのスペースが必要であるため、配列[9] 9文字とヌル文字 '\ 0'を含んでいますか?私はボードが2次元配列に変換されるときに同じ疑問を抱いています。なぜなら、ボードは配列[3] [3]で作られなければならないと理解しているからですが、それをcharとして宣言したい場合、ヌル文字ですか?チック・タック・トー・ゲームで2dキャラクター・アレイを初期化する
答えて
文字列の格納に文字配列を使用する場合は、終了ゼロが必要です。
タスクの場合、配列に文字列を格納する必要はありません。
だから、Cで、あなたはそれが文字列リテラルで初期化されているものの、配列の各要素は終了ゼロは含まれません3 * 3配列に、たとえば次のよう
を宣言してもよいです。
一方、このような配列を出力する方が簡単であると思われる場合は、各要素に終端ゼロを含めることができます。この場合、配列は、配列が正確に8を持つように宣言されて
配列は、[8] 9つの要素
が含まれていることを、あなたの文のよう
char board[3][4] =
// ^^^
{
" ", // three spaces
" ",
" "
};
のように定義されるべきです要素。 :) 私はあなたが文字列リテラルを意味すると思います。例えば、Cの文字列リテラル"Hi"
は、リテラルに格納されている終端ゼロのためにタイプchar[3]
です。
2D配列は基本的に1D配列であり、プログラマにとって使い易いものです。あなたが読んだ本はおそらく、セルに値を格納し、あなたが言ったように文字列の文字の代わりにそれらを表示します。これはボード全体を文字列として保存するよりも少し効率的です。
4x4領域の2D配列を保存するとします。あなたはサイズ16、及びそのようなアクセスなインデックスの1次元配列として、それを表現することができます。あなたはその4単位ブロックのどこにいるかjは、と私はあなたが何であるかを4単位ブロックである
arr[j + i * 4]
また、サイズ[8]の配列には8つの要素があります。例:
char arr[8]; // has 8 elements, not 9
私は配列[8]は9つの要素
いいえ、それがあるべき理由が含まれています知っていますか? int arry[8]
のように定義された配列には、8要素しか含まれていません。 Cでも配列のインデックスは0を基準にしているので、上記のような配列の場合はarray[0]
からarray[7]
までが有効なアクセスとなります。
char
アレイの場合、文字列として使用され、ヌルターミネータのためのスペースも必要です。したがって、char
の9要素の配列を持ち、文字列として使用する場合は、char[10]
と定義する必要があります。配列の値として文字を使用して
はchar
の配列はポインタchar*
に減衰することができますし、NUL
終了する文字列として解釈されているという事実とは何の関係もありません。
文字列の中に特定の型がありません。これは単なるデータの解釈方法です。あなたは2つのコンセプトをミックスしています。
char
配列がNUL
を終了する必要はありませんが、文字列としてデータを使用する機能でそれを使用しようとしている場合、それはNUL
終端が必要です。
char board[3][3]
を持つことは完全に合法であり、9文字の要素のための余裕があります。\0
は、そのデータを文字列として使用しないため、必要ありません。
文字の配列は、任意の位置の任意の値を保持できます。文字列の末尾に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]
- 1. チック・タック・トー・ゲームの開始メニュー
- 2. チック・タック・トー・ゲームでフル・ボードをチェックする機能を修正する方法
- 3. チック・タック・トー・ゲームに勝った人を見るための最適なアルゴリズム
- 4. 2Dアレイの初期化?
- 5. C++での2Dベクトルの初期化
- 6. アレイの初期化の違いのJava
- 7. アレイの初期化の方法は
- 8. アレイの初期化パフォーマンスの差
- 9. 2d char配列の初期化C
- 10. C#:オブジェクトの2D配列の初期化
- 11. Typescript - 2D配列の初期化エラー
- 12. 2D配列の処理/初期化(Java)
- 13. 2Dベクトルの初期化:初期設定の奇妙な長さ
- 14. 2dゲームのキャラクターがなぜゲームを実行しているときに落ちるのですか?
- 15. Pythonで2D配列を初期化する
- 16. C++ - ポインタ表記で2D配列を初期化する
- 17. 構造体エラー内で2D配列を初期化する
- 18. AutoHotKeyでアレイを一括して初期化できますか?
- 19. Cを学ぶ - チック - タック - トゥプログラムを終了するための助けが必要
- 20. すぐにアレイを初期化する方法
- 21. テンプレートを使用してアレイを初期化する方法
- 22. 多くのif文を使わずにチック・タック・トーのゲームで勝った人を確認する式を作成するにはどうすればよいですか?
- 23. Conwayの人生のゲーム:グリッドを初期化するには?
- 24. ループ内の2D配列を初期化する
- 25. 2D配列の配列を初期化する方法は?
- 26. Cプログラミング - 構造体2D配列を初期化する
- 27. 2D配列を初期化する際のエラー
- 28. C++ Arduino - 文字の2D配列を初期化する
- 29. 私のC++クラスで2dベクトルを初期化できません
- 30. アレイの初期化は最も速いですか?
あなたは文字列とchar配列の違いを知っていればあなたはそれを考え出しただろう。 – wrangler
8文字の配列には8文字が含まれます。あなたはCスタイルの文字列を参照しているときに、char * str = "hello"と言っています。それは余分な '\ 0'のために余裕を残すことを心配する必要があるときです。 – StaticBeagle
"配列[8]に9要素が含まれています"いいえ、それは8つの要素を含んでいます。あなたは何を信じていますか? –