配列文字型の初期化について
-
kazaoni
配列文字型の初期化について
たびたびすみません。質問です。
配列の初期化についてなんですが、たとえば10×10個の配列にあらかじめaと入れておきたい場合、
for(k=0;k<=9;k++)
{
for(l=0;l<=9;l++)
{
hairetsu[k][[/url]='a';
}
}
とやるしかないのでしょうか?
配列の初期化についてなんですが、たとえば10×10個の配列にあらかじめaと入れておきたい場合、
for(k=0;k<=9;k++)
{
for(l=0;l<=9;l++)
{
hairetsu[k][[/url]='a';
}
}
とやるしかないのでしょうか?
-
たかぎ
Re:配列文字型の初期化について
GCCだと
char array[10][10] =
{
[0 ... 9] = { [0 ... 9] = 'a' }
};
といった初期かも可能です。-
kazuoni
Re:配列文字型の初期化について
> memset関数を使ってください。
main(void)
{
char hairetsu[10][10];
int i,j,k,l,m,n;
memset(hairetsu, '*', 100);
printf("%s",hairetsu);
}
こんな感じでしょうか?(初期化したのを出力してみました。)出力結果は確かに100個「*」がありましたが、その後に文字化けがあるのですが・・・??大丈夫なんでしょうか?
main(void)
{
char hairetsu[10][10];
int i,j,k,l,m,n;
memset(hairetsu, '*', 100);
printf("%s",hairetsu);
}
こんな感じでしょうか?(初期化したのを出力してみました。)出力結果は確かに100個「*」がありましたが、その後に文字化けがあるのですが・・・??大丈夫なんでしょうか?
-
kazuoni
Re:配列文字型の初期化について
> こんな方法もあります。
>
ご回答ありがとうございます。それは自分も考えたのですが・・・・80×80だとかなり記述が面倒だと判断しました。
たかぎさん
ご回答ありがとうございます。visual c++では対応してないんですよね?lnuxでは対応してるんでしょうか?(初歩的な質問で申し訳ありません。。)
>
> char a[2][2] ={
> {'a','a'},
> {'a','a'}
> };
>
組木紙織さんご回答ありがとうございます。それは自分も考えたのですが・・・・80×80だとかなり記述が面倒だと判断しました。
たかぎさん
ご回答ありがとうございます。visual c++では対応してないんですよね?lnuxでは対応してるんでしょうか?(初歩的な質問で申し訳ありません。。)
-
box
Re:配列文字型の初期化について
> memset(hairetsu, '*', 100);
で、hairetsu[/url]は正しく初期化できています。
それよりも、hairetsu[/url]の内容を
> printf("%s",hairetsu);
で出力することに問題があります。
この記述では、hairetsu[/url]の先頭アドレスから始まって
たまたま'\0'が見つかるまで、のべつまくなしに(仮にhairetsuの領域を超えても)
出力しようとします。-
管理人
Re:配列文字型の初期化について
携帯から書いているので詳しく書けませんが、
文字列として扱うなら最後に終端記号をいれる必要があります。
文字列や終端記号というキーワードで調べてみてください。
文字列として扱うなら最後に終端記号をいれる必要があります。
文字列や終端記号というキーワードで調べてみてください。
-
たかぎ
Re:配列文字型の初期化について
> lnuxでは対応してるんでしょうか?
Linux でしょうか?(揚げ足を取る気はないのですが、念のため)
Linux の場合、GCCを使うのであれば、
Linux でしょうか?(揚げ足を取る気はないのですが、念のため)
Linux の場合、GCCを使うのであれば、
char array[10][10] =
{
[0 ... 9] = { [0 ... 9] = 'a' }
};
と書けます。-
kazuoni
Re:配列文字型の初期化について
> それよりも、hairetsu[/url]の内容を
>
> > printf("%s",hairetsu);
>
> で出力することに問題があります。
> この記述では、hairetsu[/url]の先頭アドレスから始まって
> たまたま'\0'が見つかるまで、のべつまくなしに(仮にhairetsuの領域を超えても)
> 出力しようとします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
main(void)
{
char hairetsu[10][10];
int m,n;
memset(hairetsu, '*', 100);
for(m=0;m<=9;m++)
{
for(n=0;n<=9;n++)
{
printf("%s",hairetsu[m][n]);
}
}
return 0;
}
これではだめでしょうか・・・??-
組木紙織
Re:配列文字型の初期化について
結論から言うとだめです。
なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
ということですが、
一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
する必要があるのか?ということです。
その理由が分かれば別の視点からのコメントもあるかもしれません。
なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
ということですが、
一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
する必要があるのか?ということです。
その理由が分かれば別の視点からのコメントもあるかもしれません。
-
kazuoni
Re:配列文字型の初期化について
> 結論から言うとだめです。
> なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
>
本当にありがとうございます!やっとできました。。
> 一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
> する必要があるのか?ということです。
>
実はグラフの出力を考えていて、それを配列でやろうかと考えていて。。ランダムに原点からx軸y軸に1ずつ進んでいくんです。(もちろんすべての象限を考えます。)そのとき通った格子点のグラフ表示なんです。
自分が考えたのは、ある一定の数の縦と横を二次元配列で枠を造り、あらかじめある文字(空白がいれれたら最高なんですが・・・)を代入しておきます。ランダムで出た格子点にあたる配列の箱に別の文字を代入します。あとはそのまま配列をすべて表示させたらうまいことグラフが出るのではないのかなぁってな感じなんですが。。あ、そんな馬鹿でかいものは作りません。リナックスのターミナルの画面が横144字だったんで、原点から72の縦横を考えることにしてます。
> なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
>
本当にありがとうございます!やっとできました。。
> 一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
> する必要があるのか?ということです。
>
実はグラフの出力を考えていて、それを配列でやろうかと考えていて。。ランダムに原点からx軸y軸に1ずつ進んでいくんです。(もちろんすべての象限を考えます。)そのとき通った格子点のグラフ表示なんです。
自分が考えたのは、ある一定の数の縦と横を二次元配列で枠を造り、あらかじめある文字(空白がいれれたら最高なんですが・・・)を代入しておきます。ランダムで出た格子点にあたる配列の箱に別の文字を代入します。あとはそのまま配列をすべて表示させたらうまいことグラフが出るのではないのかなぁってな感じなんですが。。あ、そんな馬鹿でかいものは作りません。リナックスのターミナルの画面が横144字だったんで、原点から72の縦横を考えることにしてます。
-
管理人
Re:配列文字型の初期化について
%sを用いれば\0がみつかるまでの表示を行ってくれますから
これなら%sで表示できます。
%sで表示するときは引数は配列の先頭アドレスでなければなりません。
#include<stdio.h>
#include<string.h>
int main(){
char hairetsu[10][10];
int i;
memset(hairetsu, '*', 100);
for(i=0;i<10;i++)
hairetsu[9]='\0';
for(i=0;i<10;i++)
printf("%s\n",hairetsu);
return 0;
}これなら%sで表示できます。
%sで表示するときは引数は配列の先頭アドレスでなければなりません。