- ベストアンサー
VC2005で数値を文字列に変換
数値を文字列に変換しようとしているのですがうまくいきません。 _itoa(),sprintf()を試したのですが何れもうまくいきません。 _itoa()の場合は, #include <stdlib.h> #include <stdio.h> CString k; int answer = 2; _itoa(answer,k); のようにすると error C2660: '_itoa' : 関数に 2 個の引数を指定できません。 というようなことが表示されます。 sprintf()の場合は、 #include <stdio.h> char* k; int answer = 2; sprintf(k,"%d",answer); のようにするとコンパイルは出来るのですが計算をし始めると、 Run-Time Check Failure #3 - The variable 'k' is being used without being defined. というメッセージボックスが表示されます。 誰か助けてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。ちと気づいたので一言。 sprintfのほうですが、ものすごく危険なことをやっているのでご注意下さい。 変数の宣言を最低限 char k[適当な数値]; にするか、あるいはサイズをきちんと計算してから、領域をmallocなどで動的にとるべきです。 記述されたプログラムだと、領域を確保していないポインタを扱おうとしているので。C言語の初心者が陥りやすい部分ではあるのですが、同時に、C言語としてはきわめて重要な部分です。 ポインタとメモリ周りを履修されなおすことをお勧めいたします。
その他の回答 (3)
- shirousa01
- ベストアンサー率36% (36/98)
VC2005との事ですが、VC2005はコンパイラの区別でいうとVC8 C++/CLI言語となりますよね? もし、C++/CLI言語で開発されている場合、全てのクラスはSystem::Object型の派生型なので、 int answer = 2; answer.ToString(); により、System::String型のハンドラを取得できます。 String型はそれ自体が文字列型ですが、char配列としたい場合、 char * k; int answer = 2; String ^ str = answer.ToString(); System::IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAuto(str); k = (char * )ptr.ToPointer(); // 開放 System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr); という方法が可能です。
お礼
ご回答ありがとうございます。 なんとか解決できました。 しかもわざわざ複数の方法を教えていただきありがとうございます。 今後に活用させていただきます。
- jacta
- ベストアンサー率26% (845/3158)
_itoaのエラーの理由は、実引数の渡し方が間違っているからです。次のようにする必要があります。 char k[50]; // 要素数は適当 int answer = 2; _itoa(answer, k, 10); ところで、数値から文字列への変換ですが、一般的には次のようにします。 int answer = 2; std::ostringstream osstr; osstr << 2; std::string str(osstr.str()); MFC等との親和性にやや難がありますが、これならint型だけでなく、longでもdoubleでもstd::complexでもOKです。
お礼
ご回答ありがとうございます。 なんとか解決できました。 丁寧な説明付きで複数の方法をアドバイスしていただきありがとうございます。 今後に活用させていただきます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
CString k; int answer = 2; k.Format("%d",answer); もしくは char k[2]; int answer = 2; sprintf(k,"%d",answer);
お礼
ご回答ありがとうございます。 なんとか解決できました。 ありがとうございました。
お礼
ご回答ありがとうございます。 なんとか解決できました。 しかも勉強すべき項目まで教えていただいてすいません。 その辺りが重要な項目だということが身にしみてわかったので、 勉強しなおします。 丁寧なご説明ありがとうございました。