2011-11-11 2 views
1

これは私がかなり長い間ここに参考にしていますが、これは私の最初の質問です。 argv [0]にはプログラムの名前が格納され、残りのコマンドライン引数は残りのargv [k]スロットに格納されることを理解します。私はまた、std :: coutがヌル終了文字列のような文字ポインタを扱い、文字列を出力することを理解しています。私のプログラムは以下の通りです。VC++のstd :: coutを使ってargv []の値を表示できません

この問題のインターネット検索で見た他のすべてのプログラムによれば、このプログラムは2つの文字列を出力する必要があります。プログラムの名前とコマンドライン引数。コンソールウィンドウは、私はこれらが[0]とargv [1] RESPをargvをするためのポインタであると信じて0010418c 001048d6

示しています。 私が持っている唯一のコマンドライン引数は、 "nanddumpgood.bin"です。これはargv [1]に入り、デバッグ中にargv []アレイをマウスオーバーすると正しく表示されます。

Whisはこれが起こっていますか?私は間違って何をしていますか?私は配列が特別な場合にポインタに崩壊することを理解していますか?これはそうではありませんか?

答えて

5

また、std::coutは、NULL終端文字列のように文字ポインタを処理して文字列を出力することも理解しています。

これは、ほとんどのです。 char*では動作しますが、他の種類の文字では動作しません。それはまさに問題です。 _TCHAR*があります。これはANSIビルドではなくUnicodeビルドではchar*です。したがって、特別な文字列の動作を取得する代わりに、デフォルトのポインタ動作が得られます。

私は理解していますが、配列は特殊な場合にポインタに崩壊しますか?これはそうではありませんか?

argvが配列であるが、どちらもargv[0]argv[1]が配列されている、彼らは両方のポインタです。腐朽はここの要素ではありません。

最も簡単な修正点は、int main(int argc, char* argv[])を使用して、コマンドライン引数として非Unicode文字列を取得することです。私はあなたがインターネット上で見つける他のコードとはるかに互換性があるので、wcoutに切り替えるのではなく、これを推奨しています。

2

ユニコード文字列にはwcoutを使用してください。

+0

これはうまくいった。ありがとう。 :) –

+0

もし彼が 'wcout'を使っているならば、' wchar_t'の引数を変更するかもしれません –

0

すべてのTCHARをwchar_tとして扱うユニコードコンパイラスイッチでアプリケーションをコンパイルすると思います。したがって、coutはargvをintとして扱います。プロジェクト設定/一般でUse Multi-byte characterセットに

代わりに書き込み

wcout << argv[0] << L" "; 
wcout << argv[1] ; 

または変更。

+0

いいえ、それは 'argv'をintとして扱わないのです。これはポインタですが、 'char * 'ではありません。 –

+0

私はVisual Studio 2010を使用していました。私は言及を忘れたと思います。 Benを解明してくれてありがとう。 –

関連する問題