「平成」を感じるもの

下記Aのような2次元配列を作るとします。

A:1行あたり1024文字(ASCII)格納できるN行の2次元配列

Aの定義をまず下記Bのように行い、その後サイズ分メモリを確保しました。

B:char *str;

この変数strを使って、x番目の行のy番目の文字を参照したい場合、どのようにすれば良いのでしょうか?
下記Cではやはりうまくいかないのでしょうか?

C:str[x][y]

申し訳ございませんが、ご教授よろしくお願い致します。

A 回答 (5件)

しばらくCから離れていたので、自信があやふやですが



char (*str)[1024];
str = ((*)[1024])malloc(sizeof(*str)*N);

でどうでしょう。
#2さんのように考えれば1024ではなく1025でも良いでしょう。
x行y列目は
str[x-1][y-1]
で参照できます。
    • good
    • 0
この回答へのお礼

目から鱗の回答、とても勉強になりました!
どうも有難うございます!

お礼日時:2004/09/06 17:53

 2次元配列の場合、「N個のポインタ配列」を作り、それをそれぞれ個別に制御する方法が挙げられます。



 一番簡単なのは、

  char **str;

 という多重ポインタ配列を用意し、まず N 個のポインタ配列を malloc します。

 str = (char**)malloc(sizeof(char*)*N);

 次に、確保した N 個の配列に、1つずつ文字列を malloc していきます。

 for ( i = 0; i < N; i++ ) {
  str[i] = (char*)malloc(256);
 }

 このとき、

  str[x]

 は、N 個中の x 番目の文字列を指します。
 また、

  str[x][y]

 は、N 個中の x 番目の文字列の中の、y 番目の文字を指します。
    • good
    • 0
この回答へのお礼

とても参考になりました!
どうも有難うございます!!

お礼日時:2004/09/06 17:53

> 行単位でデータを参照したい場合は、いい方法はありますでしょうか?



char* str = (char*)malloc(sizeof(char)*1024*N);
のとき、str+1024*x が第x行の先頭です。
    • good
    • 0
この回答へのお礼

ご回答重ねて感謝いたします!

お礼日時:2004/09/06 17:49

私なら、



#define N 100

char str[N][1025] ;

とか1024では無くて、1025で作ります。
(mallocで領域確保するにしてもです。)
なぜかは文字列だから最後の'\0'の1文字を加えてという事です。
    • good
    • 0
この回答へのお礼

ご回答とご指摘どうもありがとうございます。Nが可変長である場合、str[x][y]やstr[x]のように参照したい場合はどうしたらよいでしょうか?大変申し訳ございませんが、良かったら教えていただけないでしょうか?よろしくお願いします。

お礼日時:2004/09/06 17:18

char* str = (char*)malloc(sizeof(char)*1024*N);



char c = str[x*1024+y];


> 下記Cではやはりうまくいかないのでしょうか?
> C:str[x][y]

ダメです。
    • good
    • 0
この回答へのお礼

早速のご回答どうもありがとうございます。追加で質問させていただきたいのですが、行単位でデータを参照したい場合は、いい方法はありますでしょうか?恐れ入りますが、お時間に余裕がございましたらご教授ください。

お礼日時:2004/09/06 17:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報