
string str;
str=”abc壁xデスクトップyyy”;//一例
strから最後の一字を取り除くときに
最初から順番に各文字が2バイト文字か1バイト文字かを調べていき最後のバイトが2バイト文字の第2バイトと判明したときに最後の2バイトを除去し最後のバイトが1バイト文字と判明したときにstrの最後の1バイトを除去する
ことによってできますがstrが膨大だと時間がかかります
文字列作成時に各文字が2バイト文字なのか1バイト文字なのかをメモっておくのも管理が大変ですし
もっと早く最後の文字が1バイト文字なのか2バイト文字なのかを判定する方法は有りませんか?
No.1ベストアンサー
- 回答日時:
いわゆるシフトJISコードを使っている場合はその方法しかありません。
VC のランタイムライブラリには _ismbslead, _ismbstrail という関数がありますが、中でやっていることは同じです。
初めから文字列を Unicode で扱っておけば管理は楽になります。
基本的にすべての文字が2バイトなので。
ただ、今更変更できないかもしれませし、Win95 系は多くの API が Unicode に対応していないので、そういう API を使う場合文字コードの変換が必要になるという問題もあります。
# 環境が書かれていないので勝手に Windows と決め付けてしまいました。
この回答への補足
ありがとうございます
プログラムはWinアプリ
コンパイラは無償Borland C++5.5(API)
MFCではありません
だからシフトジスでやるしか有りません
制御コードは第2バイトでもだぶらないので改行コード以上はさかのぼらなくてもいいのですがそういったコードが全くない場合には最悪一番最初までさかのぼらなければないませんね
100kBだとたった一つの文字を取り除くだけで最悪100kB分検査しなくてはならないのですね
やっぱり文字コードと一緒にバイト数情報を記録しないといけないのでしょうか?
No.3
- 回答日時:
> strから最後の一字を取り除くときに
...
> ことによってできますがstrが膨大だと時間がかかります
メモリ内の文字列ですよね?
そんなに時間がかかるとは思えないのですが...実測したのでしょうか?
ありがとうございました
前に別件でstringの操作でものすごい時間がかかり
char*に変えたらあっという間に処理が終わったので
本件で時間がかかるようならchar*にすれば問題ないですね
No.2
- 回答日時:
後ろから見ていって「シフトJISでない(シフトJISの1文字目でも2文字目でもない)」バイトを探して、
そこから始めるようにすればいくらか速くなるでしょう。
(シフトJISに含まれない文字にはコントロールコード、特殊記号、数字などがあります。)
シフトJIS判断関数は、昔のBCCにはあったのですが、
今の処理系ではどうなっているかわかりません。
無いようならマクロかなんかで作ってください。
ありがとうございます
半角'a'が続いていると後ろから検査すれば一番最初のバイトにいくまで最後の文字が1バイト文字'a'だと判断されないけれども確率的にはだいぶ早く重ならないコードにぶち当たり早く検出できるということですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- UNIX・Linux Postfixでドコモメールに送信すると届くまで10分ぐらいかかる 6 2023/03/05 13:56
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
-
Javaで日本語1文字のバイト数
-
windowsのファイルパス最大文字数
-
memcmp バイナリデータの比較方法
-
【VB2005】テキストボックス内...
-
日付時刻を4バイトに
-
C++ Builderで文字列をバイトに...
-
ワイド文字のバイト数が取得で...
-
3バイト文字(UTF-8)をprintfで...
-
Console.writeLineで文字化け
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
:(コロン)のKeyCode
-
GetWindowTextでアドレスバーか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
ピクセル,dpiから容量(バイト...
-
C++ Builderで文字列をバイトに...
-
Javaで日本語1文字のバイト数
-
ビットスワップとバイトスワッ...
-
SQLで1バイト、2バイト混在...
-
バイナリとBCDコード
-
URLは最高何文字まで可能なので...
-
機種依存文字をチェックしたい。
-
VBAでShift-JISのURLエンコード
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
pythonでバイナリデータを配列...
-
64bit対応
-
3バイト文字(UTF-8)をprintfで...
おすすめ情報