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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazaoni

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

#1

投稿記事 by kazaoni » 16年前

たびたびすみません。質問です。

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

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


組木紙織

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

#3

投稿記事 by 組木紙織 » 16年前

こんな方法もあります。
char a[2][2] ={
		  {'a','a'},
		  {'a','a'}
        };

たかぎ

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

#4

投稿記事 by たかぎ » 16年前

GCCだと
char array[10][10] =
{
  [0 ... 9] = { [0 ... 9] = 'a' }
};
といった初期かも可能です。

kazuoni

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

#5

投稿記事 by kazuoni » 16年前

> memset関数を使ってください。

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

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

kazuoni

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

#6

投稿記事 by kazuoni » 16年前

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

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

box

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

#7

投稿記事 by box » 16年前

> 	memset(hairetsu, '*', 100);

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

> 	printf("%s",hairetsu);

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

管理人

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

#8

投稿記事 by 管理人 » 16年前

携帯から書いているので詳しく書けませんが、
文字列として扱うなら最後に終端記号をいれる必要があります。
文字列や終端記号というキーワードで調べてみてください。

たかぎ

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

#9

投稿記事 by たかぎ » 16年前

> lnuxでは対応してるんでしょうか?

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

kazuoni

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

#10

投稿記事 by kazuoni » 16年前

> それよりも、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:配列文字型の初期化について

#11

投稿記事 by 組木紙織 » 16年前

結論から言うとだめです。
なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。

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

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

kazuoni

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

#12

投稿記事 by kazuoni » 16年前

> 結論から言うとだめです。
> なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
>
本当にありがとうございます!やっとできました。。


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

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

hoge

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

#13

投稿記事 by hoge » 16年前

GCCだとこうも書けます。
char array[10][10] = {
   [0 ... 9][0 ... 9] = 'a'
};

kazuoni

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

#14

投稿記事 by kazuoni » 16年前

回答していただいたみなさん、本当にご丁寧にありがとうございました。文字列の初期化は解決しました。
本当にありがとうございました。

管理人

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

#15

投稿記事 by 管理人 » 16年前

%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で表示するときは引数は配列の先頭アドレスでなければなりません。

閉鎖

“C言語何でも質問掲示板” へ戻る