![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Excel(エクセル) 全角文字「ヴ」の半角文字「ヴ」への変換方法について 3 2022/11/05 12:07
- Excel(エクセル) エクセルの数式で教えてください。 3 2022/10/25 10:52
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
c++ 文字列を入力して、一文字ずつ表示させる関数を作りたい
C言語・C++・C#
-
6
エディットボックスの入力制限について
C言語・C++・C#
-
7
【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法
C言語・C++・C#
-
8
半角文字と全角文字の判別の仕方
C言語・C++・C#
-
9
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
10
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
11
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
12
CString のGetAt で正しく文字が取れない
C言語・C++・C#
-
13
エディットボックスのフォントを変えたい
C言語・C++・C#
-
14
文字列の置換をCStringで(C++)
C言語・C++・C#
-
15
C++でのCRLFについて
C言語・C++・C#
-
16
CString から LPCTSTRの型に変換
C言語・C++・C#
-
17
全角半角を調べるライブラリ関数はありますか?
C言語・C++・C#
-
18
CString型からdouble型への変換
C言語・C++・C#
-
19
CString Format にて全角空白文字連続して格納する方法は?
C言語・C++・C#
-
20
MFC ダイアログ上のID取得について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
文字列から、null値を除去する方法
-
CString型 全角半角を意識せず...
-
アクセス ステータスバーの文...
-
ファイル名の一部削除について
-
HEX
-
エクセルで13,410円を数値の134...
-
「シフトJIS X 0213」形式の文...
-
C言語とWin32APIで全角かなの...
-
WSTRINGとは?
-
一番右のスペース以降の文字列...
-
VBA 変数名に変数を使用したい。
-
Accessで別mdbのテーブルをコピー
-
Accessのフィールド名に半角括...
-
「Nullの使い方が不正です」の...
-
クリスタルレポートで文字列の...
-
C#でbyte配列から画像を表示さ...
-
INT64対応のprintf系関数はあり...
-
DataTableに特定のフィールドが...
-
VBAコンボボックスの内容が反映...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
アクセス ステータスバーの文...
-
VBからID3タグをいじる方法
-
一番右のスペース以降の文字列...
-
VB6のテキストボックスに入力し...
-
文字列から、null値を除去する方法
-
エクセルで13,410円を数値の134...
-
VB6.0 文字列のファイル書...
-
ワードのVBAで
-
「シフトJIS X 0213」形式の文...
-
VBScriptで半角カナと半角英数...
-
【Excel VBA】セル内テキストの...
-
機種依存文字と特殊文字について
-
VB.NET ListBox内の前方一致で...
-
バイナリデータの取り方
-
ASC関数
おすすめ情報