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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
PUMP
記事: 23
登録日時: 8年前

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

#1

投稿記事 by PUMP » 8年前

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

コード:

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]);
}

アバター
a5ua
記事: 199
登録日時: 13年前

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

#2

投稿記事 by a5ua » 8年前

> なぜ上手くいかないのかが分かりません。
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;

derok
記事: 51
登録日時: 11年前

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

#3

投稿記事 by derok » 8年前

C言語及びC++では配列の代入はコピーではなく配列自体を代入します。
つまり、nameの要素はすべて配列string自体を指しているので、すべて同じ文字が表示されます。
解決策としてはnameをstd::stringの配列にすることです。

PUMP
記事: 23
登録日時: 8年前

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

#4

投稿記事 by PUMP » 8年前

ありがとうございます。二次元配列を使うということで解決しました。
考える力を身に着けようと思い、基本的に自己解決で縛っていたので
ずいぶん長く悩んだ問題が解消されて助かりました。

閉鎖

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