色彩検定1級を取得する魅力を紹介♪

string str;
str=”abc壁xデスクトップyyy”;//一例

strから最後の一字を取り除くときに
最初から順番に各文字が2バイト文字か1バイト文字かを調べていき最後のバイトが2バイト文字の第2バイトと判明したときに最後の2バイトを除去し最後のバイトが1バイト文字と判明したときにstrの最後の1バイトを除去する
ことによってできますがstrが膨大だと時間がかかります
文字列作成時に各文字が2バイト文字なのか1バイト文字なのかをメモっておくのも管理が大変ですし
もっと早く最後の文字が1バイト文字なのか2バイト文字なのかを判定する方法は有りませんか?

gooドクター

A 回答 (3件)

いわゆるシフトJISコードを使っている場合はその方法しかありません。


VC のランタイムライブラリには _ismbslead, _ismbstrail という関数がありますが、中でやっていることは同じです。

初めから文字列を Unicode で扱っておけば管理は楽になります。
基本的にすべての文字が2バイトなので。
ただ、今更変更できないかもしれませし、Win95 系は多くの API が Unicode に対応していないので、そういう API を使う場合文字コードの変換が必要になるという問題もあります。

# 環境が書かれていないので勝手に Windows と決め付けてしまいました。

この回答への補足

ありがとうございます
プログラムはWinアプリ
コンパイラは無償Borland C++5.5(API)
MFCではありません
だからシフトジスでやるしか有りません

制御コードは第2バイトでもだぶらないので改行コード以上はさかのぼらなくてもいいのですがそういったコードが全くない場合には最悪一番最初までさかのぼらなければないませんね
100kBだとたった一つの文字を取り除くだけで最悪100kB分検査しなくてはならないのですね
やっぱり文字コードと一緒にバイト数情報を記録しないといけないのでしょうか?

補足日時:2003/04/10 08:33
    • good
    • 0

> strから最後の一字を取り除くときに


...
> ことによってできますがstrが膨大だと時間がかかります

メモリ内の文字列ですよね?
そんなに時間がかかるとは思えないのですが...実測したのでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございました
前に別件でstringの操作でものすごい時間がかかり
char*に変えたらあっという間に処理が終わったので
本件で時間がかかるようならchar*にすれば問題ないですね

お礼日時:2003/04/11 00:03

後ろから見ていって「シフトJISでない(シフトJISの1文字目でも2文字目でもない)」バイトを探して、


そこから始めるようにすればいくらか速くなるでしょう。
(シフトJISに含まれない文字にはコントロールコード、特殊記号、数字などがあります。)

シフトJIS判断関数は、昔のBCCにはあったのですが、
今の処理系ではどうなっているかわかりません。
無いようならマクロかなんかで作ってください。
    • good
    • 0
この回答へのお礼

ありがとうございます
半角'a'が続いていると後ろから検査すれば一番最初のバイトにいくまで最後の文字が1バイト文字'a'だと判断されないけれども確率的にはだいぶ早く重ならないコードにぶち当たり早く検出できるということですね

お礼日時:2003/04/11 00:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング