2010-12-07 10 views
9

私はプログラムを持って解析されない引数。ただし、出力はこれです:C++、コマンドラインが正しく

./Test.exeのHello World

STARTING ヌム入力:3 。 hは

wは唯一の終了文字まで各引数の最初の文字ではなく、全体のchar *で見ていることが表示されます。

誰でも意見はありますか?

その他の注意:VS2008を使用して作成します。基本的にインターネット上で動作するはずの例をコピーして貼り付けています。私はbash、powershell、およびcmdでプログラムを実行しました。

+3

私は '_tmain()'が 'tchar'を期待しています – ruslik

+0

あなたのプログラムに' main'関数を置いてもまだそれは起こりますか? IE、 '_tmain'の名前を変更した後... –

+0

関連:[http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c] (http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c) –

答えて

3

コードをUnicodeモードでコンパイルしていますか?

+0

これは別の正解です。プロジェクトの設定をマルチバイト文字セットに変更しても機能します。ありがとう! – jbu

+0

@jbu:これをしないと、Unicodeの機能が失われます。 MBCSモードは下位互換性のためだけのものです。 – Philipp

17

Visual C++プロジェクトがUnicodeに設定されていて、main関数の名前が_tmainです。つまり、Windowsはあなたの関数を呼び出してUnicode文字列を渡しますが、char *型を使ってANSI文字列として扱います。最初のUnicode文字の2番目のバイトはnullなので、これは1文字のANSI文字列として表示されます。

+0

これは正解です。プロジェクトの設定をマルチバイト文字セットに変更しても機能します。ありがとう! – jbu

+0

@jbuは正解として設定したいと思うかもしれません。 votinsボタンの下にあるチェックボックス。 – khachik

+0

一言...これは、あなたがこれから学んだはずのレッスンではありませんが、OKです。 –

5

ほとんどの場合、UNICODEの設定でコンパイルされています。 UNICODEが定義されている場合は、coutの代わりにwcoutを使用する必要があります。そして、すべての弦は_T()の中に入れてください。

#ifdef UNICODE 
#define tout wcout 
#else 
#define tout cout 
#endif 

int _tmain(int argc, TCHAR* argv[]) 
{ 
    std::tout << _T("STARTING") << std::endl; 
    std::tout << _T("Num inputs: ") << argc << std::endl; 

    for(int i = 0; i < argc; i++) 
     std::tout << argv[i] << std::endl; 
+0

または、代わりに、 '_UNICODE'が常に定義されていると仮定します(Windows 9xはずっと前から亡くなって以来MBCSビルドは本当に必要なくなっています)、どこでも' wmain'と 'wchar_t'を使います。 – Philipp

+0

また、 'wcout'はまだ動作しません。http://blogs.msdn.com/b/michkap/archive/2010/10/07/10072032.aspxを参照してください。 – Philipp

4

最初にchar?これは、UnicodeがANSIと解釈されるように感じる。それは理にかなっている。 _tmainを使用する場合は、TCHARを使用する必要があります。