前提・実現したいこと
最近配列や文字列を勉強したばかりの初心者です。
1画面のサイズが80*24として、4画面分の文字列を2次元配列で以下のように宣言しています。
char title[24*4][80] = {"・・・(省略)"}
エンターを押すたびにこの文字列を1画面分ずつprintf()関数で表示するプログラムを作っています。
ただし、printf()関数の呼び出しは4回に抑えたいです。
発生している問題・エラーメッセージ
1画面分の文字列を格納する変数(str)を用意して、strcat()関数でその中に文字列(title)を順次複写していき、1画面分の複写が終わったらprintf()関数を実行してから変数を初期化する、というプログラムを作ろうと思いました。
そこで以下のプログラムを作成しましたが、メモリ破壊が起きていることが分かりました。
C
1char str[] = ""; 2 3// タイトル画面処理 4void DrawTitle(void) 5{ 6 /* 画面描画処理 */ 7 for (int y = 0; y < 24 * 4; y++) 8 { 9 //文字列の連結 10 strcat(&str[0], &title[y][0]); 11 12 if ((y + 1) % 24 == 0) 13 { 14 //1画面ずつ表示する 15 printf("%s", str); 16 17 //文字列の初期化 18 strcpy(&str[0], ""); 19 20 /* ウェイト */ 21 rewind(stdin); 22 _getch(); 23 24 /* 画面クリア */ 25 system("cls"); 26 } 27 } 28}
試したこと
メモリ破壊について調べたところ、配列の要素数を超えて要素を代入したり、存在しない添え字を指定したりすることで発生するという風に理解しました。
なので、まずこの部分で「要素数を省略すると要素数は初期値の数と同じになる」ということを忘れていたので、1画面分の文字列+ヌル文字用の1文字を要素数として宣言するように修正しました。
//修正前 char str[] = ""; //修正後 char str[24 * 80 + 1];
また、文字列の初期化のやり方が間違っているのではないかと考えて、以下のように修正しました。
//修正前 strcpy(&str[0], ""); //修正後 strcpy(&str[0], "\n");
修正後のソースコード
C
1//要素数を省略すると初期値の数と同じになる 2//1画面分の文字列を格納する変数。ヌル文字用に+1。 3char str[24 * 80 + 1]; 4 5// タイトル画面処理 6void DrawTitle(void) 7{ 8 /* 画面描画処理 */ 9 for (int y = 0; y < 24 * 4; y++) 10 { 11 //文字列の連結 12 strcat(&str[0], &title[y][0]); 13 14 if((y + 1) % 24 == 0) 15 { 16 //1画面ずつ表示する 17 printf("%s", str); 18 19 //文字列の初期化 20 strcpy(&str[0], "\n"); 21 22 /* ウェイト */ 23 rewind(stdin); 24 _getch(); 25 26 /* 画面クリア */ 27 system("cls"); 28 } 29 } 30}
質問したいこと
・自己流で修正してみたんですが、これでメモリ破壊は治っていますでしょうか?
・printf()関数は4回以内という条件で、自分が考えた方法よりもっと良い方法がありましたら教えていただきたいです。
回答3件
あなたの回答
tips
プレビュー