ページ 11

配列文字型の初期化について

Posted: 2008年2月11日(月) 18:40
by kazaoni
たびたびすみません。質問です。

配列の初期化についてなんですが、たとえば10×10個の配列にあらかじめaと入れておきたい場合、

for(k=0;k<=9;k++)
{
for(l=0;l<=9;l++)
{
hairetsu[k][[/url]='a';
}
}
とやるしかないのでしょうか?

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 19:55
by 管理人
memset関数を使ってください。

http://www9.plala.or.jp/sgwr-t/lib/memset.html

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:04
by 組木紙織
こんな方法もあります。
char a[2][2] ={
		  {'a','a'},
		  {'a','a'}
        };

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:19
by たかぎ
GCCだと
char array[10][10] =
{
  [0 ... 9] = { [0 ... 9] = 'a' }
};
といった初期かも可能です。

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:20
by kazuoni
> memset関数を使ってください。

main(void)
{
char hairetsu[10][10];
int i,j,k,l,m,n;
memset(hairetsu, '*', 100);
printf("%s",hairetsu);

}
こんな感じでしょうか?(初期化したのを出力してみました。)出力結果は確かに100個「*」がありましたが、その後に文字化けがあるのですが・・・??大丈夫なんでしょうか?

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:29
by kazuoni
> こんな方法もあります。
>
> char a[2][2] ={
> 		  {'a','a'},
> 		  {'a','a'}
>         };
>
組木紙織さん
ご回答ありがとうございます。それは自分も考えたのですが・・・・80×80だとかなり記述が面倒だと判断しました。

たかぎさん
ご回答ありがとうございます。visual c++では対応してないんですよね?lnuxでは対応してるんでしょうか?(初歩的な質問で申し訳ありません。。)

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:51
by box
> 	memset(hairetsu, '*', 100);

で、hairetsu[/url]は正しく初期化できています。
それよりも、hairetsu[/url]の内容を

> 	printf("%s",hairetsu);

で出力することに問題があります。
この記述では、hairetsu[/url]の先頭アドレスから始まって
たまたま'\0'が見つかるまで、のべつまくなしに(仮にhairetsuの領域を超えても)
出力しようとします。

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 20:57
by 管理人
携帯から書いているので詳しく書けませんが、
文字列として扱うなら最後に終端記号をいれる必要があります。
文字列や終端記号というキーワードで調べてみてください。

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 21:59
by たかぎ
> lnuxでは対応してるんでしょうか?

Linux でしょうか?(揚げ足を取る気はないのですが、念のため)
Linux の場合、GCCを使うのであれば、
char array[10][10] =
{
  [0 ... 9] = { [0 ... 9] = 'a' }
};
と書けます。

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 22:37
by kazuoni
> それよりも、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:配列文字型の初期化について

Posted: 2008年2月11日(月) 22:47
by 組木紙織
結論から言うとだめです。
なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。

ということですが、
一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
する必要があるのか?ということです。

その理由が分かれば別の視点からのコメントもあるかもしれません。

Re:配列文字型の初期化について

Posted: 2008年2月11日(月) 23:31
by kazuoni
> 結論から言うとだめです。
> なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
>
本当にありがとうございます!やっとできました。。


> 一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
> する必要があるのか?ということです。
>

実はグラフの出力を考えていて、それを配列でやろうかと考えていて。。ランダムに原点からx軸y軸に1ずつ進んでいくんです。(もちろんすべての象限を考えます。)そのとき通った格子点のグラフ表示なんです。
自分が考えたのは、ある一定の数の縦と横を二次元配列で枠を造り、あらかじめある文字(空白がいれれたら最高なんですが・・・)を代入しておきます。ランダムで出た格子点にあたる配列の箱に別の文字を代入します。あとはそのまま配列をすべて表示させたらうまいことグラフが出るのではないのかなぁってな感じなんですが。。あ、そんな馬鹿でかいものは作りません。リナックスのターミナルの画面が横144字だったんで、原点から72の縦横を考えることにしてます。

Re:配列文字型の初期化について

Posted: 2008年2月12日(火) 02:12
by hoge
GCCだとこうも書けます。
char array[10][10] = {
   [0 ... 9][0 ... 9] = 'a'
};

Re:配列文字型の初期化について

Posted: 2008年2月12日(火) 12:39
by kazuoni
回答していただいたみなさん、本当にご丁寧にありがとうございました。文字列の初期化は解決しました。
本当にありがとうございました。

Re:配列文字型の初期化について

Posted: 2008年2月12日(火) 18:14
by 管理人
%sを用いれば\0がみつかるまでの表示を行ってくれますから
#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で表示するときは引数は配列の先頭アドレスでなければなりません。