文字列を配列に格納する(二次元)

Last-modified: 2007-11-10 (土) 20:58:46

概要

 というわけで文字列を配列に格納する(区切りは「,」)の二次元版です。といっても、これ自体は特に解説するようなものではありません。
 二次元用の区切りで二次元の指定を+させるだけです。比較的簡単に作れるでしょう。
 分かりにくいのは動かし方。

int STRING_AS_IN2(ref array@string@2 asX,string szX,
 string szKey = ",",string szKey2 = ":")
{
int nL = 0;
int nX = 0;int nY = 0;int nA = 0;
string szA;
  for(;;)
  {   if(szX.GetPart(nL,1) == szKey)
      {
       asX[nX][nY] = szX.GetPart(nA,nL - nA);
       ++nX; nA = nL + 1;
       }
      if(szX.GetPart(nL,1) == szKey2)
      {
       asX[nX][nY] = szX.GetPart(nA,nL - nA);nA = nL + 1;
      nX = 0;++nY;
       }
      if(nL == szX.Length())
      {
      asX[nX][nY] = szX.GetPart(nA,nL - nA);
      return 0;
      }
      ++nL;
  }
return 0;
}

作ったら動かしてみましょう。


void game_main(void)
{
array@string@2 asX[7][13];
STRING_AS_IN2(asX,
//	 00 01 02 03 04 05 06 07 08 09 10 11 12
	"壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁:"+ 	//00
	"壁,道,壁,壁,壁,道,道,道,道,道,道,道,壁:"+ 	//01
	"壁,道,宝,壁,道,道,壁,壁,道,道,道,道,壁:"+ 	//02
	"壁,壁,道,壁,道,道,壁,壁,道,道,道,道,壁:"+ 	//03
	"壁,壁,道,道,道,壁,壁,壁,壁,道,壁,壁,壁:"+ 	//04
	"壁,壁,壁,壁,壁,壁,道,道,道,道,壁,壁,壁:"+ 	//05
	"壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁,壁"   	//06
        );
S(asX[2][2]);A;
}

"宝"と出力されます。

解説

 SYSTEM4.0の仕様上、文字列を改行することができません。
 しかし二次元の場合上のコードのように改行して見やすくしたいところです。そういうときは+でつなげましょう。
 文字列は+することで繋げることができます。
例:

"がお,がお,がお,がお:がお,がお,がー(ガオレンジャー!)"

"がお,がお,がお,がお:"+
"がお,がお,がー(ガオレンジャー!)"

は同じになります。

おまけ

 二次元の場合、Reallocが使えないので(同じ機能ができなくはないですが)、「配列を初期化してから自動で取る」方法も書いておきます。
string szA;の下あたりに置いておけばOK。
STRING_WORD_NUMについては文字列に特定の文字列がいくつ含まれているか検索したいを参照してください。

int nAllocY = STRING_WORD_NUM(szX,szKey2) + 1;
int nAllocX = 0;
  for(;nL < szX.Length();nL++)
  {
     if(szX.GetPart(nL,1) == szKey2)
     {
     nAllocX = Math.Max(nAllocX, (  STRING_WORD_NUM(szX.GetPart(nA,nL - nA),szKey) + 1  ) );
     nA = nL + 1;
     }
  }
  asX.Alloc(nAllocX,nAllocY);
  nL = 0;nA = 0;