配列から指定バイトを削除し詰めるには?

解決


キスミント  2004-10-26 21:55:42  No: 54886

こんにちは、ADVゲームを製作していて困ったことがあるのでお助け願います。

char cc[256]の中に  もうかりまっか@ぼちぼちでんなぁ@
という文字列が格納されていて
描画をすると@まで描画されてしまいました。

この@は命令語で描画させたくないのですが
cc内から特定文字を検索し削除した後、削除した部分を詰める
やり方がわからず四苦八苦しています。

助言でもよいのでどなたかお助けください。

製作環境はVisual C++6.0で描画にはDirectX9SDKを使用しています。


tetrapod  2004-10-26 23:10:26  No: 54887

必ずしも詰める必要はない、とは思いませんか?
@ までの文字列を別配列に抽出するほうが簡単そうな気がします。
それに提示の例だと、もうかりまっかの表示の後、別にぼちぼちでんなぁと表示する
必要がありそうな気がしますがどないでっしゃろ。

const char *extract_string(const char *src, char *dst) {
  while (*src!=0 && *src!='@') *dst++=*src++;
  *dst++=0;
  return *src==0 ? NULL : src+1;
}
なんてのが使いやすいような気がします。
# バッファオーバーフローを考察していませんが


gari  2004-10-27 01:03:34  No: 54888

この場合の限定ならば、

char buf[256];

sprintf(buf, "%s%s", strtok(cc, "@"), strtok(NULL, "@"));

でbuf内に格納できると思いますけど…
但し後々、@の個数がランダム個ある場合も検証してやりたい場合は、
別な方法が必要ですが…


tetrapod  2004-10-27 01:10:04  No: 54889

うーん、それはダメ。関数の引数の評価順は未規定なのです。
この例では strtok が左→右の順に呼ばれる必要がありますが、コンパイラによっては
右→左の順に引数を評価する場合があります。
char *p=strtok(cc,"@");
sprintf(.., p, strtok(NULL,"@"));
のように評価順がコンパイラによらずに一意に定まるようにする必要があります。


キスミント  2004-10-27 20:43:08  No: 54890

tetrapodさんの方法を利用したところ、今までにない描画処理がされたので
これをベースに、手を加えながら組み直ししてみようと思います。

皆様、手助けありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加