• ベストアンサー

VC++におけるCStringの変換

 VisualC++6.0において、CStringというオブジェクトがありますよね。  たとえば、Edit->GetWindowText(str);  などで、strにEditのさす文字列を入れたりして、そのあとにstrを使って算術演算をするときにどうしてもstrをintかlong型に直したいのです。  キャストの仕方がよくわからないので、知っている方教えてください。よろしくお願いします。

noname#129397
noname#129397

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

LPCSTR で中身をアクセスし、strtol() のような C の関数で処理しましょう。例えば、 CString cstr; long l; l = strtol((LPCSTR)cstr, NULL, 0); この使い方だと、先に紹介されている atol() と同じですが、strtol() では、数字とみなせない 文字列を渡したときに、エラーの起きている位置を知ることができるので、真剣なプログラムには、 atol() よりは、strtol() の方が向いています。

noname#129397
質問者

お礼

ありがとうございます。ちなみに、long型やint型からCString型へ変換はどうやるのでしょうか?教えてくださるとありがたいです。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> ちなみに、long型やint型からCString型へ変換はどうやるのでしょうか?教えてくださるとありがたいです。 Format() メソッドを使います。 CString cstr; int i; cstr.Format("%d", i); こっちの方は、マニュアルを見れば一発(→参考URL)。

参考URL:
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_cstring_class_members.htm
  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

atoiや atolでどうでしょう。

関連する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はまったく別物です。

  • 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関数は、どこが良くないのでしょうか。

  • VC++2005のeditコントロールについて

    仕事でVB6.0とFortran77を使っており、今後のためにVC++2005を独学で勉強し始めたのですが、 練習がてらVBでいうTextBoxを使って簡単な計算をしようと思っているんですがうまくいきません。 目標としては2つのeditコントロールに数値をそれぞれ入力し、その2つの数字を足し算するというもの作ろうと思っています。 今のところ、GetWindowText()ってのを使って文字列(CString)を取得することは出来たのですが、 数字(Intなど)を取得することが出来ず、また文字列を整数などに変換する方法もわからない状態です。 MSDNやネットでキーワード検索しても求める情報が見つからず困っております。 どうすればいいのでしょうか?

  • CString型からdouble型への変換

    C++は初心者です。VC4.0を使っていますがMFCなどは使っていません。 CString型の変数をint型やlong型への変換はなんとかできたのですが、double型へ変換することができずに困っています。atofを使えばいいのだと思い下記のように記述したのですが、コンパイルするとエラーがでます。   CString sample = "0.234";   double i;   i = atof((const char*)sample); error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *' どう直せば無事にdouble i に0.234を格納できるのでしょうか?よろしくお願いします。

  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    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バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • 型変換の仕方について。。。

    VisualC++でプログラミングしています。 int型の数値データをCString型もしくは、char型の文字列に変換する方法をご存知の方、ぜひ、アドバイスお願いします。

  • CString ←→ BSTRの変換について

    次のコードのように、CString ←→ BSTRの変換を行いたいのですが、データがUTF8だと文字化けしてしまいます。 どうすれば良いでしょうか? 環境:VC++7(.net 2003)+MFC+WinXP 【結果】 CString-------------------------- FFFFFFE2 FFFFFF97 FFFFFF8B 3C BSTR-------------------------- FFFFFFE2 FFFFFF97 FFFFFF81 45 【ソース】 int intCT; int nSize = 0; BYTE *pSource = (BYTE *)"○<"; this->ConvSJistoUtf8(pSource, (BYTE *)NULL, &nSize ); BYTE* pDist = new BYTE[ nSize + 1 ]; ZeroMemory( pDist, nSize + 1 ); this->ConvSJistoUtf8(pSource, pDist, &nSize ); CString str = CString(pDist); delete []pDist; pDist = NULL; BSTR bstr; bstr=str.AllocSysString();//CString→BSTRへの変換 CString str2=CString(bstr);//BSTR→CStringへの変換 TRACE("CString--------------------------\n "); for( intCT = 0; intCT < str.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str[intCT]); } TRACE("\n "); TRACE("BSTR--------------------------\n "); for( intCT = 0; intCT < str2.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str2[intCT]); } TRACE("\n "); BOOL ConvSJistoUtf8( BYTE* pSource, BYTE* pDist, int* pSize ) { *pSize = 0; //ShiftJISからUTF-16へ変換 const int nSize = ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, NULL, 0 ); BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ]; ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, (LPWSTR) buffUtf16, nSize ); //UTF-16からShift-JISへ変換 const int nSizeUtf8 = ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR) buffUtf16, -1, NULL, 0, NULL, NULL ); if( !pDist ){ *pSize = nSizeUtf8; delete buffUtf16; return TRUE; } BYTE* buffUtf8 = new BYTE[ nSizeUtf8 * 2 ]; ZeroMemory( buffUtf8, nSizeUtf8 * 2 ); ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)buffUtf16, -1, (LPSTR) buffUtf8, nSizeUtf8, NULL, NULL ); *pSize = lstrlen( (char*)buffUtf8 ); memcpy( pDist, buffUtf8, *pSize ); delete buffUtf16; delete buffUtf8; return TRUE; }

  • CString 大量連結

    VC++6.0のMFCで開発してます。 プログラム内で CString str; str += ○○ とやって連結し終わった後にstrを使って 処理をする所があって試した所すごく遅く、文字列がかなり 長いと固まってしまいます。調べたらCStringの大量連結は パフォーマンスががた落ちって書いてありました。 何か良い方法はないでしょうか? ※連結は必須です。

  • CStringについて

    よろしくお願い致します。 CString型の文字の最後の1文字を’¥0’に変更するにはどうすれば良いのでしょうか? CStringのことが良く分かっていないので、質問の仕方が変かも知れませんがお教えください。 今は仕方なしに、こんな感じでやってます。 CString m_InputData; char moji[100]; int n; strcpy(moji,m_InputData); n=strlen(moji); moji[n-1]='\0' m_InputData=moji;

  • CStringについて

    CStringにおいてFindではエラーが出ないのに、ReverseFindだとエラーがでます。 error C2664: 'ReverseFind' : 1 番目の引数を 'char [4]' から 'char' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 キャストするとエラーは出ませんが文字列の検索は失敗してしまいます。 Findはまったく問題無いのにどうしてこのようなことが起きるのでしょう? どう対処すれば良いか教えてください。 CString ddd; ・ ・ nn=ddd.Find("DOW");     ←エラーなし nn=ddd.ReverseFind("DOW"); ←エラーあり 環境はWIN98 VC++6.0 MFCです。

専門家に質問してみよう