- ベストアンサー
文字変換方法について
- VC++6.0にて勉強中の初心者です。現在、テキストエディタ1(例:"H")とテキストエディタ2("0001")に入力した文字列を16進変換し、テーブル(例:cmd)に格納し、テキストエディタ3には、1,2で入力した文字列を表示したいのですが、どのようにすればよいでしょうか?
- 以下のコードは、VC++6.0での文字変換方法についての参考になります。
- CMogiver1Dlg::OnOK()関数では、テキストエディタ1とテキストエディタ2の入力内容を比較し、条件が合えば16進数に変換してテキストエディタ3に表示しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>ちなみにcmd = 0A, と入力した場合にm_text3を、 10と表示させる時はどうすれば良いでしょうか? ですからぁ、入れるところはcmdではなくm_text2では? cmd = 0A; これじゃコンパイル通りません。 で、基数変換にはstrtolを使います。 http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_strtol.2c_.wcstol.htm char * stopstring; m_text3.Format("%ld", strtol(m_text2, &stopstring, 16)); こんな感じですかね。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>テキストボックス1には"H"・"I"・"J"その他の文字列を入力し、 >テキストボックス2の"0001"・"0015"その他の文字列を入力後、 >ボタン押下後、条件が合致した時にテキストボックス3に >16進変換表示をするので、必要です。 って、ちゃんと#1の補足に先に書いておいてくださいね。 ということであれば、 cmd = atoi(m_text2); //m_text3 = cmd; m_text3.Format("%x", cmd); のようにFormatメソッドで数値を文字列に変換可能です。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/vclrfcstringtformat.asp Formatメソッドの書式文字列は、printfの書式文字列と同じです。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_Format_Specification_Fields_.2d_.printf_and_wprintf_Functions.asp http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_printf_type_field_characters.asp 上の例では、cmd = 1, 書式が%xなので、 m_text3は 1 となります。 もし、cmd = 10, 書式が%02Xでしたら、 m_text3は、 0A となります。 おまけ > の記号ですが、引用の意味でつけている記号なので、 YZ80さんつけ方が逆ですよ。
補足
ありがとうございます。実行しましたところ、間違いなく動作しました。 ちなみにcmd = 0A, と入力した場合にm_text3を、 10と表示させる時はどうすれば良いでしょうか? 記号のつけ方今後は気をつけます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>まずはテキストボックス2の値をcmdに格納された時に、文字列"0001"が16進変換できるようにしたいと思います。 ですから・・・ 説明をしっかりとしてくださいね。 ・テキストボックス2の値をcmdに入れるのは誰ですか? OKボタンを押したときに処理の中で自分で入れるんですよね。 ・"0001"は16進数に変換できますよ。「できるようにしたい」ではなく、 「変換する」ですよね? 「OKボタンが押されたときに、テキストボックス2の値を数値にしてcmdに格納し、 文字列"0001"を16進に変換したい」ってこと? ??? これでも情報が欠如してる・・・・ もう一度、正しく説明してください。 あと、説明からも、ソースからも以下の点が読み取れません。 ・16進数に変換したいものは結局どの値? ・変換した結果はどこ出力したい? ・"0001"がソース中に記述されているがなぜ? ・"H"がソース中にいますけど、まだ使いますか? こちも補足をお願いします
補足
何度も説明が出来なくてすみません。 ・テキストボックス2の値をcmdに入れるのは誰ですか? OKボタンを押したときに処理の中で自分で入れるんですよね。 >そうです。ボタンが押された時に処理の中で格納します。 ・"0001"は16進数に変換できますよ。「できるようにしたい」ではなく、 「変換する」ですよね? >はい。「変換する」です。 「OKボタンが押されたときに、テキストボックス2の値を数値にしてcmdに格納し、 文字列"0001"を16進に変換したい」ってこと? ??? これでも情報が欠如してる・・・・ もう一度、正しく説明してください。 あと、説明からも、ソースからも以下の点が読み取れません。 ・16進数に変換したいものは結局どの値? >テキストボックス2に文字列で入力された値です。 ・変換した結果はどこ出力したい? >テキストボックス3です。 ・"0001"がソース中に記述されているがなぜ? ・"H"がソース中にいますけど、まだ使いますか? >テキストボックス1には"H"・"I"・"J"その他の文字列を入力し、テキストボックス2の"0001"・"0015"その他の文字列を入力後、ボタン押下後、条件が合致した時にテキストボックス3に16進変換表示をするので、必要です。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>VC++6.0にて勉強中の初心者です。 がんばってください。 ぜひ、正しい用語を覚えてください。 ×テキストエディタ ○エディットコントロール or テキストボックス テキストエディタは、メモ帳のようなアプリケーションを指します。 >現在、テキストエディタ1(例:"H")とテキストエディタ2("0001")に入力した文字列を16進変換し、 エディット1にH、エディット2に0001と入力されたときに文字列を16進変換し ということですか? 少なくとも"H"は16進数に変換できません。 >cmd = atoi(m_text1); >cmd = 0x38; //テキストエディタ1.2の条件が合えば、8を表示する。 m_text1の内容をせっかくcmdに入れているのに0x38で上書きしている意図は何でしょうか? >テキストエディタ3には、1,2で入力した文字列を表示したいのですが、 >cmd = 0x38; //テキストエディタ1.2の条件が合えば、8を表示する。 >m_text3 = cmd; 8を表示させようとしているように見えるのですが、何を表示させたいのでしょうか? ということで、質問内容をもう一度見直し、回答者の人たちが意図を読み取れるような文章にしていただかないと、これでは誰も答えられないかと。
補足
早速のアドバイスありがとうございます。 すみませんでした。確かに"H"は16進変換できません。 16進変換したいのはテキストボックス2入力される、文字列です。 それから、0x38は"H"の場合、8をテキストボックス3にさせたかったのですが、先にテキストボックス1で16進変換は出来ませんので、この処理も無効とさせて頂きます。 まずはテキストボックス2の値をcmdに格納された時に、文字列"0001"が16進変換できるようにしたいと思います。 void CMogiver1Dlg::OnOK() { int cmd; UpdateData(TRUE); if(( m_text1 == _T("H") ) && (m_text2 == _T("0001"))){ cmd = atoi(m_text2); m_text3 = cmd; } UpdateData(FALSE); 説明が下手ですみません。よろしくお願い致します。
お礼
何度もすみませんでした。 確かにコンパイルは通りませんね。 char * stopstring; m_text3.Format("%ld", strtol(m_text2, &stopstring, 16)); ご教示頂きました、ソースを動かしました。strtol関数は考えたのですが、型宣言で*は全く思いつきませんでした。 ありがとうございます。