全角スペースを削除 – プログラミング – Home

通知
すべてクリア

[解決済] 全角スペースを削除


roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

・文字列を取得して、
 その文字列の先頭に空白があれば、削除し、
 最後尾から空白があれば、削除して、
 文字列の前後に空白がない状態にする処理
 をしたいと思っています。

・作業環境は
 MFC
 VC++です。

・半角スペースは、削除できましたが、
 全角スペースの削除方法がわかりません。
CString Wrk;
Wrk = GetAt(i)[0];  ←ここで行単位で文字列取得
Wrk.TrimLeft( _T( \t) );


引用未解決
トピックタグ
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

↑の発言は未完成の状態で送信してしまいました。
・文字列を取得して、
 その文字列の先頭に空白があれば、削除し、
 最後尾から空白があれば、削除して、
 文字列の前後に空白がない状態にする処理
 をしたいと思っています。

・作業環境は
 MFC
 VC++です。

・半角スペースは、削除できましたが、
 全角スペースの削除方法がわかりません。
 しかも簡単にできると助かります。

CString Str=  あ  ;
Str.TrimLeft();
Str.TrimRight();

これだけだと、「あ」の前後にある全角スペースが消えません。
どなたかご存知な方教えてください。


返信引用
yas0302
 yas0302
(@yas0302)
ゲスト
結合: 23年前
投稿: 37
 

全角だけなら。

while( Str.Left(2)==  )
{
Str.Delete(0,2);
}
while( Str.Right(2)==  )
{
Str.Delete(Str.GetLength()-2,2);
}

半角も取り除く場合は、
TrimLeft()、TrimRight()と
組み合わせてください。


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

yas0302さんありがとうございます。
なるほど、自分が考えていたものよりも、
スマートなやり方です。

しかしながら、全角スペース、半角スペースが交互にくる場合、
複雑な処理になりますよね。

処理としては、
文字列の左側から全角スペースの削除、半角スペースの削除を
空白以外の文字列が見つかるまで繰り返し、
同様に右側からも繰り返すということですよね。

もっと単純な方法というのはないものでしょうか。
贅沢を言ってごめんなさい


返信引用
yas0302
 yas0302
(@yas0302)
ゲスト
結合: 23年前
投稿: 37
 

これでどうですか。

while( Str.TrimLeft(_T( \t)),Str.Left(2)==  )
{
Str.Delete(0,2);
}
while( Str.TrimRight(_T( \t)),Str.Right(2)==  )
{
Str.Delete(Str.GetLength()-2,2);
}


返信引用
うま
 うま
(@うま)
ゲスト
結合: 23年前
投稿: 3
 

むかし、似たようなことをした覚えがあります。
そのときは、MFCはつかってませんでしたので
参考になるかどうかは分りませんが、
そのときのコードは以下のような感じです。

============================================================
BOOL DeleteSpace(const char* str,char * RetrunBuff,int BuffSize)
{
BOOL bRet = FALSE;
int leng = strlen(str),cnt = 0,BuffCnt=0;
char *Buff;

if(RetrunBuff == NULL) return FALSE;

Buff = new char[leng];
if(Buff == NULL) return FALSE;

memset(Buff,0,leng);
while(cnt < leng && str[cnt] != NULL)
{
//半角スペース(0x20)
if((BYTE)str[cnt] == 0x20)
{
cnt++;
}
//全角スペース(0x8140)
else if((BYTE)str[cnt] == 0x81 && (BYTE)str[cnt+1] == 0x40)
{
cnt+=2;
}
else
{
Buff[BuffCnt] = str[cnt];
cnt++;
BuffCnt++;
}
}

//コピー先のバッファは足りているか?
if(BuffSize > BuffCnt)
{
strcpy(RetrunBuff,Buff);
bRet = TRUE;
}
delete []Buff;

return bRet;
}
=======================================
むか~しに作った関数なので、あまりスマートな
方法ではないかもしれませんが、一応これで
スペースは消えますよ。
これをちょっと改造してCStringの派生クラスを自分で作って
メンバ関数にするもよし、必要な時に
呼び出せるようにグローバルな関数にするもよし
と思います・・・。

お役に立てればよいですが・・・。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

マルチバイトを扱う場合は、
マルチバイト用関数を使った方が1バイトor2バイトの区別を
しなくて良いので素直な作りにできます。

スッキリしてるかどうかは分かりませんが。

unsigned char* trimleft(unsigned char* str)
{
while (_ismbcspace(_mbsnextc(str)))
str = _mbsinc(str);
return str;
}

unsigned char* trimright(unsigned char* str)
{
unsigned char* end = _mbschr(str, '\0');
unsigned char* p;
for (;; end = p) {
p = _mbsdec(str, end);
if (!p || !_ismbcspace(_mbsnextc(p)))
break;
}
return end;
}


返信引用
クラフトマン
 クラフトマン
(@クラフトマン)
ゲスト
結合: 24年前
投稿: 72
 

正攻法は皆さんが示されているので、邪道を^^;
まず、『本文中の全角スペースは、半角スペース二つに変わる仕様だ』と言い張る覚悟が必要。
で、
Wrk.Replace( , );
// ↑変換されちゃってるかもしれないので説明。
// 最初のは全角スペースで、二番目は半角スペース2つ
Wrk.TrimLeft();
Wrk.TrimRight();
とします。(未確認)

#というか、TrimLeft(LPCTSTR)で、全角スペースを含めて指定すれば、削除できても
#よさそうだが。出来ないのであれば、TrimLeftのバグといっていいかもしれない。
#おおかた、全角スペース先頭バイト(0x81)を取り出したときに、符号拡張で誤認識
#してるとか、そのあたり。


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

みなさん、ありがとうございます。

一番楽そうなので、yas0302さんの方法ですることに
しました。
こんなに簡単な方法でできるなんて思いませんでした。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました