
CString型の文字列に格納されている文字を1文字ずつ取り出したいです。
ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。
半角だけなら、str[0] str[1]...という風に取り出せますが、
全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。
その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。
CString ripString(CString str,int index){ //ソースとなる文字列、n文字目
/*~処理~*/
return 文字列;
}
たとえば"あaいbうcえdおe"という文字列を入れると、
CString str="あaいbうcえdおe";
ripString(str,0) →結果 "あ"
ripString(str,1) →結果 "a"
ripString(str,2) →結果 "い"
ripString(str,3) →結果 "b"
・
・
・
こういうことをするのに良い方法はありますか?
1バイトごとのそれぞれの文字自身が、
・半角文字なのか
・全角文字の前1バイトなのか
・全角文字の後1バイトなのか
これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
VC++6.0 をインストールするとき
種々の選択肢が出てきますが そのとき
UNICODEを選択します
そうするとCStringにたいする操作は自動的にバイト単位ではなくて
文字単位になります
特別な関数は必要としません
ただしOSがUNICODEを持っていることが必要です
たとえばWindowsXPだとデフォールトでOKですが
Windows98ではそのままではだめです
No.2
- 回答日時:
単にキャストすればいいですよ。
_ismbbleadでも可能だと思いますが。
次の文字へポインタを進める関数_tcsinc(CharNext)を使った例です。
CString ripString(CString str, int index)
{
LPCTSTR pStart = str;
for (int i = 0; i < index; ++i) {
pStart = _tcsinc(pStart); // CharNextでも同様
}
LPCTSTR pEnd = _tcsinc(pStart); // CharNextでも同様
TCHAR result[3];
const int len = pEnd - pStart;
memcpy(result, pStart, len);
result[len] = _T('\0');
return result;
}
No.1
- 回答日時:
CStringって言ってるからVC++だと仮定するなら
_ismbsleadと_ismbstrail
参考URL:http://msdn.microsoft.com/ja-jp/library/scab1bx7 …
この回答への補足
ありがとうございます。VC6にてです。
教えていただいた_ismbslead()を使おうとしてみましたが引数がよく分からず、
調べていたところ見つけた「_ismbblead()」を使ってみたところ、
目的としていたことが8割がたできたようですが、一部取り逃がすようです。
(2バイトの先頭なのにそう判断してくれない)
やはり、教えていただいた_ismbsleadを使うしか無いようです・・・
引数が「const unsigned char*」となっていて、どのように入れれば良いかが分かりません。
int _ismbslead(
const unsigned char *str,
const unsigned char *current
);
(ismbblead()のほうですと、単純に単体文字へのポインタ(char*型)を入れれば機能はしたのですが。)
同じように入れようとすると、
「char* をconst unsigned char*に変換できない」
という内容のコンパイルエラーが出ます。
詳細な使い方を教えていただけると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
-
4
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
5
CStringをwchar_tに変換したい
C言語・C++・C#
-
6
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
7
エディットボックスで改行
その他(プログラミング・Web制作)
-
8
文字列の置換をCStringで(C++)
C言語・C++・C#
-
9
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
10
CStringの配列要素を関数で受け渡しするには?
C言語・C++・C#
-
11
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
12
C++でのCRLFについて
C言語・C++・C#
-
13
【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法
C言語・C++・C#
-
14
エディットボックスのフォントを変えたい
C言語・C++・C#
-
15
CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法
C言語・C++・C#
-
16
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
17
エディットボックスの入力制限について
C言語・C++・C#
-
18
リストコンロールの一行だけを太文字に(VC++)
C言語・C++・C#
-
19
適切な変換関数が存在しない???
C言語・C++・C#
-
20
画面を強制的に再描画させる方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
CString型 全角半角を意識せず...
-
一番右のスペース以降の文字列...
-
文字の並び替え
-
「シフトJIS X 0213」形式の文...
-
HEX
-
VB6のテキストボックスに入力し...
-
VBA 変数名に変数を使用したい。
-
『列名 '担当者CD' があいま...
-
INT64対応のprintf系関数はあり...
-
Access VBA 添付型フィールド
-
VB.NETでのAccessテーブルリンク
-
VB6.0の「vbFromUnicode」はVB....
-
エクセルでXY座標に並べられた...
-
VB6からの移行したいけど、VB.N...
-
DataTableに特定のフィールドが...
-
Redim とEraseの違いは?
-
エクセルのテーブルを解除する...
-
名前'dbOpenDynaset'は宣言され...
-
コンボボックスのインデックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
ファイル名の一部削除について
-
一番右のスペース以降の文字列...
-
機種依存文字と特殊文字について
-
StrConvでUnicodeに変換出来な...
-
アクセス ステータスバーの文...
-
セル内の文字を分ける
-
VBからID3タグをいじる方法
-
エクセルで13,410円を数値の134...
-
VBE上の文字検索で「パターン文...
-
VB6.0 文字列のファイル書...
-
文字列から、null値を除去する方法
-
「シフトJIS X 0213」形式の文...
-
HEX
-
エンコード・デコードの仕方
-
【Excel VBA】セル内テキストの...
-
VBAにおける正規表現について教...
-
VBA 変数に使う文字などについて
おすすめ情報