- ベストアンサー
文字列の最後の一字を削除
string str; str=”abc壁xデスクトップyyy”;//一例 strから最後の一字を取り除くときに 最初から順番に各文字が2バイト文字か1バイト文字かを調べていき最後のバイトが2バイト文字の第2バイトと判明したときに最後の2バイトを除去し最後のバイトが1バイト文字と判明したときにstrの最後の1バイトを除去する ことによってできますがstrが膨大だと時間がかかります 文字列作成時に各文字が2バイト文字なのか1バイト文字なのかをメモっておくのも管理が大変ですし もっと早く最後の文字が1バイト文字なのか2バイト文字なのかを判定する方法は有りませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
いわゆるシフトJISコードを使っている場合はその方法しかありません。 VC のランタイムライブラリには _ismbslead, _ismbstrail という関数がありますが、中でやっていることは同じです。 初めから文字列を Unicode で扱っておけば管理は楽になります。 基本的にすべての文字が2バイトなので。 ただ、今更変更できないかもしれませし、Win95 系は多くの API が Unicode に対応していないので、そういう API を使う場合文字コードの変換が必要になるという問題もあります。 # 環境が書かれていないので勝手に Windows と決め付けてしまいました。
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> strから最後の一字を取り除くときに ... > ことによってできますがstrが膨大だと時間がかかります メモリ内の文字列ですよね? そんなに時間がかかるとは思えないのですが...実測したのでしょうか?
お礼
ありがとうございました 前に別件でstringの操作でものすごい時間がかかり char*に変えたらあっという間に処理が終わったので 本件で時間がかかるようならchar*にすれば問題ないですね
- liar_adan
- ベストアンサー率48% (730/1515)
後ろから見ていって「シフトJISでない(シフトJISの1文字目でも2文字目でもない)」バイトを探して、 そこから始めるようにすればいくらか速くなるでしょう。 (シフトJISに含まれない文字にはコントロールコード、特殊記号、数字などがあります。) シフトJIS判断関数は、昔のBCCにはあったのですが、 今の処理系ではどうなっているかわかりません。 無いようならマクロかなんかで作ってください。
お礼
ありがとうございます 半角'a'が続いていると後ろから検査すれば一番最初のバイトにいくまで最後の文字が1バイト文字'a'だと判断されないけれども確率的にはだいぶ早く重ならないコードにぶち当たり早く検出できるということですね
補足
ありがとうございます プログラムはWinアプリ コンパイラは無償Borland C++5.5(API) MFCではありません だからシフトジスでやるしか有りません 制御コードは第2バイトでもだぶらないので改行コード以上はさかのぼらなくてもいいのですがそういったコードが全くない場合には最悪一番最初までさかのぼらなければないませんね 100kBだとたった一つの文字を取り除くだけで最悪100kB分検査しなくてはならないのですね やっぱり文字コードと一緒にバイト数情報を記録しないといけないのでしょうか?