文字列に含まれる文字で処理を分岐させたい

Last-modified: 2007-10-17 (水) 22:01:23

概要

 SACT_RESUME_SAVESACT_RESUME_LOADを一つの文字列の中に含まれている文字列で分岐させる関数を作ってみます。
 適当ですので先頭二文字のみでの分岐。
 文字列の中にその文字列が含まれているかどうかは、xxx.Findを使って調べることができます。これは、文字列の中に文字列が含まれているならその始めの文字目を、含まれていないなら-1を返す文字列用関数です。

 
void SaveDate(string szX)
{
  int nX;
  string szY = szX.GetPart(2, szX.Length() -1);
 if(szX.Find("SV") != -1){SACT_RESUME_SAVE(szY,szY,nX);return;}
 if(szX.Find("LD") != -1){SACT_RESUME_LOAD(szY,szY);return;}
}

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

void game_main(void)
{
 ' ある日のこと。'A;
 SaveDate("SVtest00");
 ' 歩き慣れた道を、学生は憂鬱そうに歩いていた。'A;
 ' 息は白く、頬は紅い。'A;
 ' 冷たい冬の風がスカートの裾を揺らしている。'A;
 '「あーあー、学校いきたくないなあ」'A;
 ' 学生はそう云って肩をすくめた。'A;
 SaveDate("LDtest00");
 }
 

解説

一回目("SVtest00")

  1. "SVtest00"の2文字目から最後までの文字列をszYに取得します。(つまりtest00です)
  2. "SVtest00"に"SV"が含まれているか取得します。
  3. もしその戻り値が(-1)でないのなら、"SV"は含まれているので、szYをセーブ名にしてセーブします。

二回目("LDtest00")

  1. "LDtest00"の2文字目から最後までの文字列をszYに取得します。(つまりtest00です)
  2. "LDtest00"に"SV"が含まれているか取得します。
  3. もしその戻り値が(-1)なら、"SV"は含まれていないので、"LD"が入っているか取得します。
  4. もしその戻り値が(-1)でないのなら、"LD"は含まれているので、szYをロード名にしてロードします。
 
 
 
 
 

おまけ(文字列に含まれる部分的な文字列を削除して取得)

 文字列から任意の文字列を取り除いたものを戻り値として取得する関数を作ってみます。
 文字から部分的に文字を取り除く場合、xxx.Eraseを使います。これは文字列から任意の文字目一文字を削除する文字列用関数です。
 Eraseは戻り値で取得するのではなく、ダイレクトにそのstring変数に反映されるので注意してください。

 
string StringDEL(string szX,string szY)
{
 int nX = szX.Find(szY);  if(nX == -1){return "szYは含まれていません。";}
 int nY = szY.Length();
 for(;nY > 0;){szX.Erase(nX);--nY;}
 return szX;
}

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

void game_main(void)
{
string szX = StringDEL("ツタンカーメンの呪い","カーメン");
S(szX);A;  //'ツタンの呪い'と表示されます
}

解説

  1. まずnXに任意の文字列がスタートする始めの文字目を取得します。(この場合は3)
  2. 次に任意の文字列の文字数を調べて(int nY)に取得します。カーメンの場合は4。
  3. あとはeraseでnY(文字数)回、始めの位置の文字を消します。(※消す度に右が左へ詰めていくから)
     
     

 これを上記の SaveDate 関数のszYの取得に上手く使うようにすると、「SV(orLD)が含まれていれば、それが先頭でなくともファイル名が同じになる」関数にすることも出来ます。

 この関数では二つその任意の文字が含まれている場合には対応していません。
 二つ含まれている場合は始めのところだけを消します。
 例えば、"ツタンカーメンの呪いカーメン","カーメン";なら、"ツタンの呪いカーメン"になります。