• ベストアンサー

CStringから1文字を取り出すには?

CStringから1文字を取り出すために以下のようにして確認しましたが、文字化けした字が表示されてしまいます。 なにかおかしなことをやっているのでしょうか? よろしくご指導下さい。 CString qq="あいう"; dc.TextOut(0,0,qq.GetAt(2);

  • mk1234
  • お礼率94% (1832/1940)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> 実際には”あいabcう”が何か分かっていない状態で、1文字ずつを取り出したいのです。 関数 _mbsbtype(const unsigned char*, size_t) で、各byteが何であるか判定できます。 マニュアルを読んでください。

mk1234
質問者

お礼

本当に何度もありがとう御座いました。 あとは自力でがんばってみます。

その他の回答 (2)

回答No.2

> ”あいabcう”のように全角と半角が混ざっている > ときはどうすれば良いのでしょうか? 各文字に対して何byte目にあるか/何byteで構成されて いるかを判定してください。 # 一旦UNICODEに変換するのがいちばん楽かも…

mk1234
質問者

お礼

回答ありがとう御座います。 言葉足らずですみません。 実際には”あいabcう”が何か分かっていない状態で、1文字ずつを取り出したいのです。 お分かりでしたらお願いいたします。 無理なようでしたら、アドバイスを参考に調べて見ます。

回答No.1

TestOutに与えるべきは 文字列 ですが、 あなたが与えたのは 文字 です。 さらに、"あいう" に対する GetAt(2) の 結果は、2-byteで構成される "い" の 最初の 1-byteです。 dc.TextOut(0, 0, qq.Mid(2,2));

mk1234
質問者

お礼

回答ありがとうございます。 ようやくなんとか1文字を取り出すことが出来たのですが、”あいabcう”のように全角と半角が混ざっているときはどうすれば良いのでしょうか? 何度もすみませんが、宜しくお願いいたします。

関連するQ&A

  • キャストについて str = (CString*)("999") ;

    環境 WIN98 VC++6.0 MFC にて いつもお世話になります。 先日質問したばかり(QNo.682705)なのですが、やはり納得できないことがあるのでお願いします。 分かっている人からみれば、おかしな疑問と思われるかも知れませんが、私にとっては素朴に疑問が生じてしまいます。 *************************** 以下2つのコードのうち、<A>は文法的にOKで<B>がNGな理由が知りたいです。 <A> CString* str ; str = (CString*)m_array.GetAt(i) ; //OK <B> CString* str ; str = (CString*)("999") ; //NG <A>は、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。 と教わりましたが、むしろ私にはCString*以外が入っているため、CString*のキャストしていると思える。 CString*が入っているのなら、キャストする必要は無いのではないでしょうか? ネット上で見つけたコードなため、実際の値やm_arrayの宣言がどうなっているかは確認出来ません。 そして、<A>がおかしなコードでは無いという大前提にたつと、<A>は別の表現をすると <A> str = (CString*)(CString*以外のポインタ) ; となります。 そうすると<B>のコードも、"999"は999の文字列が入っているアドレスを指すポインタであるという考えが正しいとすると、 <B> str = (CString*)(999をさすポインタ) ; となり、おかしなコードではないと思えるのですが、考え方のどこがおかしいのでしょうか? ************************** 以下のことを教わった上であえて聞いています。 str = (CString*)("999"); は、リテラル文字列をつっこもうとしています。 リテラル文字列とCStringはまったく別物です。

  • CString型で混乱しています

    今CString型で設定した変数を使ってこのように書きました CStrig tt; tt=1; pDC->TextOut(20,20,tt); このように書いたのですが、画面には・のようなものしか表示されません。 これは自分がおかしいのでしょうか?

  • dc.TextOut(0 ,0 , *str) ;について

    環境 WIN98 VC++6.0 MFC にて パターンBはOKですが、パターンAだと不正な処理で落ちてしまいます。 どうしてなのかお教えください。 void CFffView::OnPaint() { CPaintDC dc(this); //パターンA CString* str ; str = (CString*)("999"); dc.TextOut(0 ,0 , *str) ; //パターンB CString aaa ; aaa = (CString)("999"); dc.TextOut(0 ,0 , aaa) ; }

  • CString型の文字列連結について

    質問させて頂きます。 開発環境はVC++.netです。 CString型の文字列連結について教えて頂きたく。 CString Test[_MAX_FNAME+1]; という変数にがあるとします。 Test変数のデータは Test[0]には"2" Test[1]には"1" が格納されてるとします。 Test変数のデータをCString Text1という変数に 以下のようなソースで文字列連結処理を行ったのですが、だめでした。 何がいけないのでしょうか? for(int i = 0; i <= 2; i++) { Text1 += Test[i]; } 実行結果は Text1には"2"が格納されたままでした。 実際はText1には、"2""1"となってほしい。 分かりにくい説明とは思いますが、 回答、ヒントなどを頂けますでしょうか 宜しくお願い致します。 それと、もしよかったら、Text1の格納データは "2","1"としたいので、カンマ区切りのやりかたなども ヒントを頂けたら幸いです。 以上です。 宜しくお願い致します。

  • CStringとCByteArrayの変換

    いつもお世話になっています。 MFCのCStringクラスとCByteArrayを相互に変換したいと考えているのですが、どうもうまくいきません。 文字コードはユニコードを想定しています。 ====================================================== CByteArray data; CString cs1 = _T("あいうえお"); CString cs2; LPBYTE lpByte = (LPBYTE)(LPCTSTR)cs1.GetBuffer(); data.SetSize(cs1.GetLength() * sizeof(TCHAR)); CopyMemory(data.GetData(), lpByte, data.GetSize()); cs1.ReleaseBuffer(); cs2 = (LPCTSTR)data.GetData(); AfxMessageBox(cs2); ====================================================== (現在の出力状況) あいうえお・・・・ 文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。 他に良い方法があればよろしくお願いします。

  • 文字化けしない書き方

    CString str = "%#.3f" という文字列に関して、数字部分をint valで置き換えたいなと思っています。 そこで、Formatを使って以下のように書きましたが、%#.が文字化けしてしまいます。 str.Format("%s%df", "%#.", val); 1文字ずつなら表示されるようなのですが、%#あるいは#.とやると文字化け(□)になって しまいます。なので、 str.Format("%s%s%s%df", "%", "#", ".", val); とやると、表示されるには表示されるのですが、str.Format("%s%df", ...)という書き方で 書けたらなと思っています。何か方法はないでしょうか。 よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。

  • CString を使わないで小数点キャスト

    MFCを使っています。 CString strTest; strTest.Format("%5.2f%", 50.12) としているのを、CStringを使わないでfloatから文字列にしたいのですが、 どのようにすればよいでしょう? 簡単な方法は無いでしょうか? 変換後は DrawText で表示するものです。 よろしくお願いします。

  • CString: 識別子が見つかりません

    開発環境:Visual c++ 2008 Express Edion OS:Win XP Pro 次のエラーが表示されていて解決できません。 エラー内容は 1>d:\vc_source\dump\dump\Form1.h(448) : error C3861: 'CString': 識別子が見つかりませんでした です。 ちなみにinclude文は以下です。 #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string> #include <cstring> やりたいことは String型からCString型を経由して、TCHAR型へ変換することです。またはその逆方法の変換です。そのためにCString型は必要になるのですが、そこでコンパイルエラーになっています。 知っているかがおりましたら、教えて下さい。

  • 文字化けを直す方法を教えてください。

    中国人と正月休みに会話連絡するために中国語チャットQQをインストールしたのですが、文字化けしてしまってわかりません。文字化けを直す方法は書いてあったのですがよく分からないです。どうしたらよいでしょうか。教えてください。 御願いします。

  • 【VC++6.0(MFC)】CString型の変数から数字部分を取り出すには?

    いつも大変お世話になっています。 VC初心者です。 現在、VC++6.0(MFC)でコーディングしております。 早速ですが、有識者の方がいらっしゃいましたら ご教授頂きたくお願いします。 ===質問=== CString型変数に以下のような数値を含む文字列から 数値部分だけを取り出すにはどうやってソースを 組めば宜しいでしょうか? ===例01=== CString cs1 = "2009年7月29日"; この文字列から "2009","7","29"を取得したい ===例02=== CString cs2 = "AM10:00:00 -0.4℃"; この文字列から "10","0","0","-0.4"を取得したい 以上、よろしくお願いします。

専門家に質問してみよう