int field[5][5];
void initField()
{
int i,j;
for(j = 0 ; j < 6 ; j++)
{
for(i = 0 ; i < 6 ; i++)
{
field[j][i] = 1;
}
}
for(i = 0 ; i < 6 ; i++)
{
field[i][0] = 0;
field[i][6 - 1] = 0;
field[0][i] = 0;
field[6 - 1][i] = 0;
}
}
//strcatで使用する
char *str2[6] = {"◇","1","2","3","4","△"};
//-----------------
int main(void)
{
int i,j;
initField();
for(j = 0 ; j < 6 ; j++)
{
char str1[13];
str1[0] = '\0';//-----------------------なぜこの処理をしなければならないのかわかりません
for(i = 0 ; i < 6 ; i++)
{
switch(field[j][i])
{
case 0:
if(j == 0)
strcat(str1,str2[i]);//ここの処理はstr1[]にstr2[i]番目の値を連結していくですよ
// ね?次の処理では1行目の処理で「str1[]に6個+NULL」の
// 入った 所に2行目表示の処理str1[]が入る
// これを繰り返すとchar str1[13];を溢れてしまうのですが・・・
else if(i == 0)
strcat(str1,str2[j]);
else
strcat(str1,"□");
break;
case 1:
strcat(str1,"・");
}
}
printf("%s\n",str1);
}
}
「strcat」について
「strcat」について
C言語初心者です、下記のコードにて私では理解することの出来ない部分が多々ありましたので、どなたかご指導お願いします。
上記でコメントをしている部分が理解できないため全体的に把握でいていない状態です。
Re: 「strcat」について
本題へ行く前に、initField()で、field[][]の定義範囲外の
領域にアクセスしまくっているのを何とかする必要がありそうです。
領域にアクセスしまくっているのを何とかする必要がありそうです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 「strcat」について
本題へ行く前に、initField()で、field[][]の定義範囲外の
領域にアクセスしまくっているのを何とかする必要がありそうです。
すみませんでした、int field[5][5]; → int field[6][6];
こう直すということでしょうか?
領域にアクセスしまくっているのを何とかする必要がありそうです。
すみませんでした、int field[5][5]; → int field[6][6];
こう直すということでしょうか?
Re: 「strcat」について
コメントのインデント及び、field[][]を修正しました。
上記でコメントをしている部分が理解できないため全体的に把握でいていない状態です。[/quote]
int field[6][6];
void initField()
{
int i,j;
for(j = 0 ; j < 6 ; j++)
{
for(i = 0 ; i < 6 ; i++)
{
field[j][i] = 1;
}
}
for(i = 0 ; i < 6 ; i++)
{
field[i][0] = 0;
field[i][6 - 1] = 0;
field[0][i] = 0;
field[6 - 1][i] = 0;
}
}
//strcatで使用する
char *str2[6] = {"◇","1","2","3","4","△"};
//-----------------
int main(void)
{
int i,j;
initField();
for(j = 0 ; j < 6 ; j++)
{
char str1[13];
str1[0] = '\0';//-----------------------なぜこの処理をしなければならないのかわかりません
for(i = 0 ; i < 6 ; i++)
{
switch(field[j][i])
{
case 0:
if(j == 0)
strcat(str1,str2[i]);//ここの処理はstr1[]にstr2[i]番目の値を連結していくですよ
// ね?次の処理では1行目の処理で「str1[]に6個+NULL」の
// 入った 所に2行目表示の処理str1[]が入る
// これを繰り返すとchar str1[13];を溢れてしまうのですが・・・
else if(i == 0)
strcat(str1,str2[j]);
else
strcat(str1,"□");
break;
case 1:
strcat(str1,"・");
}
}
printf("%s\n",str1);
}
}
Re: 「strcat」について
この後 i のループで最初(i=0)は、必ずstr1の先頭に文字列をコピーすることになります。
その後、i = 1~5 までstr1に文字列を追加することになります。
追加する文字列はいずれも全角1文字(=2bytes)なので、6 回追加すると 6 x 2 = 12
str1のサイズは、それに終端文字を含めたサイズ 13 バイトになっているのです。
(つまり i のループに入る前に必ず str1 の初期化を行っているのでサイズオーバーにならない
だから str1[0] = '\0';の1行を外せば、あなたの懸念通り、str1 のサイズをオーバーするよ)
こんな説明で分かるかな?
#文字列は終端文字があってはじめて文字列と言えるのだよ。
その後、i = 1~5 までstr1に文字列を追加することになります。
追加する文字列はいずれも全角1文字(=2bytes)なので、6 回追加すると 6 x 2 = 12
str1のサイズは、それに終端文字を含めたサイズ 13 バイトになっているのです。
(つまり i のループに入る前に必ず str1 の初期化を行っているのでサイズオーバーにならない
だから str1[0] = '\0';の1行を外せば、あなたの懸念通り、str1 のサイズをオーバーするよ)
こんな説明で分かるかな?
#文字列は終端文字があってはじめて文字列と言えるのだよ。
written by へにっくす
Re: 「strcat」について
へにっくす様
大変わかりやすい解答ありがとうございました。
「\0'の位置にstrcpy」 「必ずstr1の先頭に文字列をコピーする」 ←この事を知りませんでしたので勉強になりました。
i のループを一回終え j++ をし 「str1[0]='\0'; 」、もう一度 i のループに入る
この時str1[]の中は{"\0", "1", "2", "3", "4", "△","\0"}だと思います
「必ずstr1の先頭に文字列をコピーする」 ⇔ 必ず「先頭にある終端文字」から文字列をコピーしていく
このように解釈したのですが、正しいでしょうか
大変わかりやすい解答ありがとうございました。
「\0'の位置にstrcpy」 「必ずstr1の先頭に文字列をコピーする」 ←この事を知りませんでしたので勉強になりました。
i のループを一回終え j++ をし 「str1[0]='\0'; 」、もう一度 i のループに入る
この時str1[]の中は{"\0", "1", "2", "3", "4", "△","\0"}だと思います
「必ずstr1の先頭に文字列をコピーする」 ⇔ 必ず「先頭にある終端文字」から文字列をコピーしていく
このように解釈したのですが、正しいでしょうか
Re: 「strcat」について
この解釈はいいんだけどねえ。こんばんは さんが書きました:必ず「先頭にある終端文字」から文字列をコピーしていく
この書き方じゃ、文字列の配列になるよ。こう書かないと。 これを文字列はcharの配列とみなすと、こう書ける。こんばんは さんが書きました:この時str1[]の中は{"\0", "1", "2", "3", "4", "△","\0"}だと思います
str1[] = {0x81, 0x9E, 0x82, 0x50, 0x82, 0x51, 0x82, 0x52, 0x82, 0x53, 0x81, 0xA2, 0x00}; // Shift-JISだった場合
こう書かないといけないね。
str1[] = {0x00, 0x9E, 0x82, 0x50, 0x82, 0x51, 0x82, 0x52, 0x82, 0x53, 0x81, 0xA2, 0x00}; // Shift-JISだった場合
written by へにっくす
Re: 「strcat」について
すみません、返信遅くなりました。
文字列リテラル等、配列についての勉強不足を痛感いたしました。
へにっくす様 最後まで大変ありがとうございました。
文字列リテラル等、配列についての勉強不足を痛感いたしました。
へにっくす様 最後まで大変ありがとうございました。