ページ 11

文字列を格納する配列の扱い方について

Posted: 2016年4月13日(水) 19:53
by PUMP
テキストファイルにキャラクター等の名前を書いておき、それをプログラムで配列変数に代入しようと思っているのですが
なぜ上手くいかないのかが分かりません。
代入する時に全ての要素に代入してるようなのですが...解決策を教えてください。

コード:

char string[100]; 
char *name[20];

// テキストファイルを行ごとに読み取り、配列変数に代入
int name_fhandle = FileRead_open("name.txt",false);
for (int i=0; i<20; i++) {
	FileRead_gets(string,100,name_fhandle);
	name[i] = string;
}

// 配列変数の中身を表示
for (int i=0; i<20; i++) {
	DrawFormatString(0,i*15,GetColor(255,255,255),"%s",name[i]);
}

Re: 文字列を格納する配列の扱い方について

Posted: 2016年4月13日(水) 20:50
by a5ua
> なぜ上手くいかないのかが分かりません。
name = string;
はポインタを代入しているだけであり、文字列全体をコピーするわけではありません。
nameはすべて、stringという配列の先頭アドレスを指すことになります。


> 解決策を教えてください。
では、いくつかの選択肢とヒントを

(1)最も簡単な解決策は、二次元配列を使うことでしょうか
char name[20][100];

(2)char *name[20];のままでやりたいのであれば、
ループ内でmalloc()を使いつつstrcpy()で文字列をコピーすれば良いでしょう

(3)あるいは、C++の標準ライブラリを使うことも選択としてはありでしょう(学習が必要かもしれませんが)
std::string name[20]; //もしくは、std::vector<std::string> name;

Re: 文字列を格納する配列の扱い方について

Posted: 2016年4月13日(水) 20:51
by derok
C言語及びC++では配列の代入はコピーではなく配列自体を代入します。
つまり、nameの要素はすべて配列string自体を指しているので、すべて同じ文字が表示されます。
解決策としてはnameをstd::stringの配列にすることです。

Re: 文字列を格納する配列の扱い方について

Posted: 2016年4月13日(水) 22:06
by PUMP
ありがとうございます。二次元配列を使うということで解決しました。
考える力を身に着けようと思い、基本的に自己解決で縛っていたので
ずいぶん長く悩んだ問題が解消されて助かりました。