- ベストアンサー
- すぐに回答を!
【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"を取得したい 以上、よろしくお願いします。
- yuki7091
- お礼率42% (104/244)
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
- 回答No.1
- yamaj_biz
- ベストアンサー率71% (10/14)
正規表現ライブラリなんかを組み込めば数行で出来そうですが…。 やはりぐるぐる回すしか無いんじゃないでしょうか。 以下は直書きなので動くかどうかはわかりませんが、とりあえず思いつきで書いてみます。 CString cs1= "2009年7月29日"; int pos; while ( !cs1.IsEmpty() ) { pos = cs1.SpanExcluding("0123456789-.").GetLength(); cs1 = cs1.Mid(pos); pos = cs1.SpanIncluding("0123456789-.").GetLength(); cout << cs1.Left(pos) << endl; cs1 = cs1.Mid(pos); }
その他の回答 (1)
- 回答No.2
- titokani
- ベストアンサー率19% (341/1726)
sscanfかな。 int y,m,d; if( sscanf(cs1,"%d年%d月%d日",&y,&m,&d) == 3 ){ printf("%d,%d,%d\n",y,m,d); }else{ printf("書式が違います\n"); } といった感じ。 動作確認はしていません。プロジェクトがunicodeの場合は適宜変更してください。
質問者からのお礼
ご回答、ありがとうござます。 教えていただいたコードで出来ました。 ありがとうございました。
関連するQ&A
- 【VC+ 2005】CStringは使えないのでしょうか?
VC++2005超初心者です。 ちょっとした案件でVC++6.0から 2005に変えるということになりました。 現在VC++2005を利用して、ちょっとしたソースを書いていますが VC++6.0でしようしていたCStringが利用できなくて困ってます。 例:CString aaa; と宣言したら、CStringを認識してくれません。 CStringって、使えないのでしょうか? なにかをincludeとかするべきなのでしょうか? 多分、本当に超簡単な問題かも知れませんが、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++(VC6)で、CString型を配列へ
C++(VC6)で、CString型の文字列をCString型の配列へセットする方法を教えてもらえませんか? キーワード検索で、AND検索・OR検索を実現する為に、まずはCString型の文字列をCString型の配列にセットしたいです。 例えば、 □阪神□□□野球□赤松□□ と入力されたCString型の文字列を、 keyword[0] = 阪神 keyword[1] = 野球 keyword[2] = 赤松 と、セットしたいのです。 ※文字列中の"□"は全角空白、または半角空白を表しています。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- 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"としたいので、カンマ区切りのやりかたなども ヒントを頂けたら幸いです。 以上です。 宜しくお願い致します。
- 締切済み
- C・C++・C#
- CString 大量連結
VC++6.0のMFCで開発してます。 プログラム内で CString str; str += ○○ とやって連結し終わった後にstrを使って 処理をする所があって試した所すごく遅く、文字列がかなり 長いと固まってしまいます。調べたらCStringの大量連結は パフォーマンスががた落ちって書いてありました。 何か良い方法はないでしょうか? ※連結は必須です。
- ベストアンサー
- C・C++・C#
- MFCのCStringについて
MFCで、CStringをメンバとして含むクラスと、このクラスのオブジェクトを動的に生成して値を代入し、生成したオブジェクトへのポインタを返す関数を以下のように定義しました。 class Record { public: long Id; CString Str; }; Record* CreateRecord(long Id_in, CString Str_in) { Record* ret; if ((ret = (Record*)malloc(sizeof(Record))) == NULL) { return NULL; } ret->Id = Id_in; // (1) ret->Str = Str_in; // (2) return ret; } この関数のコンパイルはうまくいきますが、関数実行時にメモリ参照エラーとなります。 調べてみると、(1)のlong型変数への代入はうまくいっているのですが、(2)のCString型変数への代入がうまくいっていないようです。 既にインスタンス化されているRecord型オブジェクトへのポインタを受け取り、それに代入するという関数であればうまく動きました。 (例) void SetRecord(Record* received, long Id_in, CString Str_in) { received->Id = Id_in; received->Str = Str_in; } 先に示したCreateRecord関数は、どこが良くないのでしょうか。
- ベストアンサー
- C・C++・C#
- Windowsアプリケーションのクラッシュ(CStringによる?)
社内で使用しているアプリケーションを以下の環境で製作しています。 VC Ver6、MFC使用 OS:Windows2000 このとき、一定期間(45~49日)をおくとクラッシュ してしまう現象が発生してしまい、試しにデバッガ上で動作させてみて試したところ、CStringで定義したオブジェクトに”=”で直接、文字列を代入している箇所でブレークポイントがかかっていました。但し、この場所としてはMFCのCFileクラスのOpenの中でした。 そこで以下の項目について何か情報があれば教えていただけないでしょうか。 1.CStringのマイクロソフト自身のヘルプ情報に以下のような”=”を使用した文字列の代入はメモリリークを発生する可能性があります、とありました。これを避けるには例えばFormat等を使用すれば回避できるものでしょうか。 例:CString aaa; aaa = ”1234”; これを以下のように変更。 aaa.Format(”1234”); 2.最初に記述しているように、MFC側でも項目1のような使用法を行っているようですが、このMFCはソースがあるので、それを仮に修正して試すようなことは一般的に可能でしょうか。 以上よろしくお願いします。 不明点等あれば御連絡お願いします。
- 締切済み
- C・C++・C#
- 【VC++2005】ソースの書き方:コーディングを****.hのファイルに書いてもいいでしょうか?変数名の命名規則はありますか?
VC++2005の超超初心者です。 現在、VC++2005(Express Edition)でCLRでプロジェクトを つくり、いろいろとコーディングしています。 今まで、参考書「作って覚えるVisual C++ 2005 Express Editon」 を利用して、半分泣きながらコーディングしていました。 その参考書では、コーディングを*****.cppでなく、 ****.hのファイルにすべて書いているのですが、いいものでしょうか? 先輩が残していったVC++6.0のソースを見ると、cpp内に書いていますが どちらがよろしいでしょうか? また、他の参考書を見ると、変数名の先頭に「m」をつけていますが、 何か意味があるのでしょうか? (変数名をつける時の作法ってありますか?) せっかくなら、きれいなソースを書きたいと思うので、 詳しい方いましたら、ご教授頂きたく思います。
- ベストアンサー
- C・C++・C#
- キャストについて 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はまったく別物です。
- ベストアンサー
- C・C++・C#
- CString にいれた値で"0"以外の数字があればメッセージを出したい
CString にいれた値で"0"以外の数字があればメッセージを出したい お世話になります。 VC++6.0 MFCで開発しております。 CString atai; atai=kazu; ※kazuには不特定桁の数字が入っております。 if(ataiに"0"以外の数字がひとつでもあれば真) メッセージ としたいのですが、どのようにすれば、ataiの中の文字から0以外の数字がひとつでもあることを見つけれるでしょうか?? ※"0"があるかないかを調べたいのではなく、"0以外の"数字があるかないかを調べたいのです。 お手数ですが何卒よろしくお願いします。
- ベストアンサー
- C・C++・C#
- VC++2005で、CString型に16進文字列を入れたいのですが・・
VC++2005で、CString型に16進文字列を入れたいのですが・・・ 次のようなエラーが出ます。 void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [5]' から 'const wchar_t *' に変換できません。 プログラムは次の通りです。 CString strBuff; CString strWork; TCHAR tszBuff[80]; UINT unLength; UINT un1; unLength = 5; strBuff = "12345"; _tcscpy(tszBuff, strBuff); strWork = ""; for(un1 = 0; un1 < unLength; un1++) { strWork = strWork + strBuff.Format("%02x", tszBuff[un1]); ←ここにエラーがあると言われています。 } 結果は、strWorkに、"3132333435"となるようにしたい! ネットで探したら、 >UNICODEを使われているのだと思われます。 >T("")マクロを使ってワイドキャラクタに変換するように指示すれば動くと思います。 とあったので、 strWork = strWork + strBuff.Format(_T("%02x"), tszBuff[un1]); としてみたのですが、 二項演算子 '+' : 型 'void' の右オペランドを扱う演算子が見つかりません (または変換できません)。 というエラーが表示されました。 VC++6.0を半年かじり、今日、初めてVC++2005に触った程度の初心者です。 どなたか助言を頂ければ幸いです。 環境 Windows XP Pro SP3 Visual C++ 2005(MFC) 以上、よろしくお願いします。
- ベストアンサー
- C・C++・C#
質問者からのお礼
ご回答、ありがとうございます。 教えて頂いたコードで出来ました。 ありがとうございました。