• ベストアンサー

配列のサイズを動的に指定したい。

現在FeliCaを使ったプログラムを作っているのですが、 FeliCaから読み込んだデータを各配列にサイズぴったりで格納したいんですが、読み込むデータによって配列のサイズが違うため、あらかじめ配列のサイズを指定しておくことができません。  例1「012 34567 89]    例2「01 2345678 9」   a[3]=012           a[2]=01   b[5]=34567          b[7]=2345678   c[2]=89            c[1]=9 というように空白で区切った文字列を各配列に格納したいのです。 なにか良い方法はないでしょうか? ソフトはVisualStudio6.0を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

VC6のころのC言語でそういう配列は作れませんので、 サイズぴったりにこだわるなら、配列ではなく いわゆる動的配列(std::vectorやstd::string、CStringArray等)やnew[]等を使ってください。

shu0325
質問者

補足

VC6以降では可能なのでしょうか? VisualStudioを.NET2003 や 2005にバージョンアップすることは可能なのですが・・・。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★配列サイズが固定ならば、ポインタ配列でどう? ・読み込んだ『012 34567 89』データを別な場所にコピーして、  区切り文字の空白をNULL文字に変換します。これと同時に  ポインタ配列へ『012』、『34567』、『89』の先頭ポインタを  セットしていけばメモリを節約できます。分かりますか? ・配列ぴったりで格納したいのですよね。 ●サンプル void Func( char data[] ) ←読み込んだ『012 34567 89』データを渡す {  char *list[ 100 ]; ←最大 100 個のトークがあるとする場合  char *buff;  char *find;  char **p = list;    if ( (buff = (char *)malloc(strlen(data) + 1)) != NULL ){   strcpy( buff, data );      for ( find = buff ; *find != '\0' ; ){    for ( *p++ = find ; *find != '\0' ; find++ ){     if ( *find == 0x20 ){ ←空白文字(区切り文字)      *find++ = '\0';      break;     }    }   }   *p = NULL; ←リストの最後を表すコツ。   /*   list配列が次のようになる。   list[0] ⇒ a[3 + 1]="012"   list[1] ⇒ b[5 + 1]="34567"   list[2] ⇒ c[2 + 1]="89"   list[3] ⇒ NULL ポインタで最後の要素を表す   */   free( buff );  } } 最後に: ・分からなかったらもう一度質問してね。 ・以上。おわり。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列空白毎に区切りをstring型で格納

    現在FeliCaを使ったプログラムを作っているのですが、 FeliCaから読み込んだデータをstring型で格納したいのですが、 方法がわかりません。  例1「012 34567 89]    例2「01 2345678 9」   a=012           a=01   b=34567          b=2345678   c=89            c=9 というように空白で区切った文字列をsring型で格納したいのです。 なにか良い方法はないでしょうか? 環境はVisualStudio.NET2003です

  • 二次元配列のサイズについて

    下記のプログラムにおいて、 Public 文字列格納(,) as Variant とか、 Public 文字列格納(,3) as Variant のような、二次元配列を宣言はできないでしょうか? 下記のプログラムは、A1セルに書かれた文字列を、 一文字ずつに分解してB列に転記し、 逆さにしたものを、1文字ずつにC列に転記する プログラムです。A1セルに書かれる文字列の長さは不定です。 本当の目的は、NCBI等から取得したDNAの塩基配列を入力したら、 相補鎖の塩基配列を作成したり、タンパク質に翻訳したり、 乖離エネルギーを計算したりするためのコードで、その一部を 簡単化したものです。 ===プログラムのソース=== Public 文字列格納 As Variant Public 文字列(100, 2) As Variant Sub テスト() 文字列格納 = Cells(1, 1) 長さ = Len(文字列格納) For i = 1 To 長さ 文字列(i, 1) = Mid(文字列格納, i, 1) 文字列(i, 2) = Mid(文字列格納, 長さ - i + 1, 1) Cells(i, 2) = 文字列(i, 1) Cells(i, 3) = 文字列(i, 2) Next i End Sub

  • C# listviewで指定した配列にあるデータで、TEXTBOXへ表

    C# listviewで指定した配列にあるデータで、TEXTBOXへ表示ついて 例 listviewに 1 2 3 4 5 6 7 8 A Aさん 50 B Bさん 40 C Cさん 60 D こういう感じで B行にある3列に40のデータを TEXTBOXへ表示したいのですが、どなたかご存知いましたらプログラムソース教えて戴けませんか? お願いいたします。

  • 入力された文字列を一文字ずつ配列に格納する方法

    例えばABCって文字列が入力されたら配列に data[0]="ABC" と格納するのではなく data[0]="A" data[1]="B" data[2]="C" と格納するにはどう書けばいいのでしょうか?

  • 配列の問題

    学校の宿題でできないのが出てきました(´-ω-`) 誰か教えてください。 大きさn(0~n-1)の配列a,bと大きさ2n(0~2n-1)の配列cがあり、今配列cに整数データが格納されているとする。このとき、cの奇数列をaに、偶数列をbに取り出せ。

  • 配列への文字列の追加ってどうやって追加するの?

    配列に文字列をいれたいのですが char a[100]; sprintf(a,"AB"); と書くと a[0]にAが a[1]にBが a[2]に\0が格納されますよね。 「配列に一度格納された文字列に新たな文字列を追加」したいのです。 つまり この\0を上書きしてa[2]から CD を追加し、結果 a[0]にAが a[1]にBが a[2]にCが a[3]にDが a[4]に\0が 格納されているようにしたいのです。 半角英数だったらできるのですが全角だとどうやるのでしょうか。 やりたい事は以下のようなものです。 "あい"を1度目の処理で配列に文字列を格納し、次の処理で"うえ"を追加し、 配列aをprintfするとき「あいうえ」が出力されるようにしたいのです。 どなたか教えてください(>_<

  • ファイルの読み込み、配列に格納

    お世話になります。Java初心者です Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。 読み込むテキストファイルには以下のような1行の文が、 Dr. Fujita is great! 読み込むデータファイルには以下のような文字が書かれています。 AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD 配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。 上の例でいえばこのような状態で格納です↓ DRFUJITAISGREAT データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。 上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。 import java.io.*; public class sample{ public static void main(String[] args){ try{ FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); Strings; while((s=b.readLine())!=null){ System.out.println(s); ←読み込んでるか確認 } }catch(Exception e){ System.out.println(no file); } } } ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。 読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。 FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・ 読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。 あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。 宜しくお願いします

    • ベストアンサー
    • Java
  • PHPで配列の検索方法

    PHPで下のような2次元配列があったとします。(りんご=a、みかん=bのような意味です。CSVからデータを2次元配列に格納したものです。) $data[0][0]="りんご" , $data[0][1]="a" $data[1][0]="みかん" , $data[1][1]="b" $data[2][0]="ばなな" , $data[2][1]="c" $data[3][0]="ぶどう" , $data[3][1]="d" ここで下のような1次元配列$hogeがあったとき $hoge[0]="ばなな" , $hoge[1]="りんご" 新たに1次元配列$hogehogeを用意して、2次元配列の中から"りんご"や"ばなな"に対応する文字列を探し出して $hogehoge[0]="c" , $hogehoge[1]="a" と、格納したいのですが、やり方がわかりません。 イメージとしまして、 $hoge[0]→($data[0][0]~$data[3][0]の中から探す)→($data[2][0]であるとわかる)→($data[2][0]に対応するのは$data[2][1]だとわかる)→($hogehoge[0]=cと格納) もし分かる方がおられましたらお願いします。

    • ベストアンサー
    • PHP
  • 配列等へのアクセスについて

    プログラム初級者です。 普通配列などへデータを格納するときはインデックスを使って、取り出す時もインデックスを使うと思いますが、一意の文字列をキーとしてデータの格納、取り出しをするような方法はないでしょうか?

    • ベストアンサー
    • Java
  • 配列のサイズが明示的でない計算について

    Fortranを例にとった場合、 行列A,Bの積Cを計算する場合、例えば以下のようなループで計算していました。(Fortran77) do i=1,10 do j=1,10 sum=0.0 do m=1,10 sum=sum+a(i,m)*b(m,j) enddo c(i,j)=sum enddo enddo それが今では、以下1行です。(Fortran95) c=matmul(a,b) 配列1つ1つの成分について計算する必要がないと言えそうです。Pythonなんかは全部こういう思想ですね。 プログラム言語はすべてこういう方向に進んでいるように思えます。 これがやや不安に思えるところがあります。配列のサイズを指定していないのでどこまで使って計算しているかわからないからです。 古い方(上段)では配列のサイズや上限を指定しているので、指定しているところより先がどうなっていてもとりあえず被害はありません。 しかし、サイズについてのケアがないと思いがけないような計算をしてくるんじゃないかと思うのですが。計算のバグ取のときここ大丈夫かな?となって疑心暗鬼ということにならないかと思うのですが。 配列の最大値なども関数1つと言う感じですが、どこまでの範囲での最大なの?と聞きたくなるわけですが。 いかがでしょうか。