トップページ > 記事閲覧
多次元配列の初期化&サイズ指定について
名前:たりゃー。 日時: 2015/12/01 21:09

初めての投稿になります。至らない点があればご指摘のほどを。 外部テキストファイルの文字列を多次元配列に読み込ませるために以下のようなコードを書きました。 char String[2][256]={}; ・ ・ ・ FileHandle = FileRead_open("test.txt"); for(int i =0; i<100; i++){ FileRead_scanf(FileHandle,"%s",String[i]); } FileRead_close(FileHandle); ※外部テキストファイルのtest.txtは30文字×6行のものです。 このように外部テキストファイルを読み込んだのですが、ここで1つ疑問がわきました。それは、配列Stringの1つ目の[]の要素数は2であるのに、なぜ6行のテキストファイルを読み込めたのか・です。 (ちなみにforのなかの100という数字は、大きめに設定した適当な値です。) この状態で試しにStringの中身をDrawStringで書き出してみたところ、しっかりと5行、テキストファイルの中身と同じように映し出されました。 これは動的に配列を宣言しているということなのですか?(でもnewやmalloc等は使っていないし・・・。) 以上が質問になります。
メンテ

Page: 1 |

Re: 多次元配列の初期化&サイズ指定について ( No.1 )
名前:Nameless 日時:2015/12/02 22:18

答えは否です。 今回はたまたまうまく読み込めただけで、いつでも読み込めるとは限りません。 C(C++)では、配列の範囲の外にアクセスしてしまってもエラーは出しません。 その場合の動作は「未定義」となります。 「未定義」とは何が起こるかわからないという事です。 今回のようにたまたま何事もなかったかのようにふるまうこともあれば、プログラムがクラッシュすることもあります。 ちなみに ・FileRead_eofを使うことでファイルを最後まで読み込んだか判定できます。 ・例えば一行に256文字以上の文字が書かれていた時もこのままだと未定義の動作になってしまいます。(配列の256番目以降に書き込もうとするため)  これに対処するためには%sを%255sとするかFileRead_getsを使うかどちらかにします。 これで書き直すとこんな感じになります。 FileHandle = FileRead_open("test.txt"); for(int i =0; i < 2/*Stringの要素数*/; ++i) { if(FileRead_eof(FileHandle)){ break; }//最後まで読み込んだら終了 //256はString[i]の要素数、255はそれからNULL終端文字分引いたもの FileRead_scanf(FileHandle,"%255s",String[i]); //FileRead_gets(String[i], 256, FileHandle ) ;//getsを使う場合はこちら } FileRead_close(FileHandle);
メンテ
Re: 多次元配列の初期化&サイズ指定について ( No.2 )
名前:たりゃー。 日時:2015/12/24 22:50

返信が遅れてしまいました。 なるほど、定義されていないところ(メモリ?)に記録されていくのですね。 大変勉強になりました。 これからも精進しようと思います。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存