1

かなり前から参考のためにここに来ていますが、これがサイトでの最初の質問です。argv [0]はプログラムの名前を格納し、残りのコマンドライン引数は残りのargv[k]スロットに格納されることを理解しています。また、std :: coutが文字ポインタをnullで終了する文字列のように扱い、文字列を出力することも理解しています。以下は私のプログラムです。

#include "stdafx.h"
#include <fstream>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

    cout << argv[0] << " ";
    cout << argv[1] ;

    return 0;
}

この号でインターネット検索で見た他のすべてのプログラムによると、このプログラムは2つの文字列を出力する必要があります。プログラムの名前とコマンドライン引数。コンソールウィンドウに次のように表示されます

0010418c 001048d6

これらはそれぞれargv[0]とargv[1]へのポインタだと思います。私が持っている唯一のコマンドライン引数は「nanddumpgood.bin」です。これはargv[1]に入り、デバッグ中にargv[]配列にマウスを合わせると文字列が正しく表示されます。

これは何が起こっているのですか?私は何が間違っているのですか?特別な場合、配列はポインタに減衰しますか?これはそうではない場合ですか?

4

3 に答える 3

5

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

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

特別な場合、配列はポインタに減衰しますか?これはそうではない場合ですか?

argvは配列ですが、配列でもありargv[0]ませんargv[1]。どちらもポインタです。ここでは崩壊は要因ではありません。

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

于 2011-11-11T16:03:35.240 に答える
2

wcoutUnicode文字列に使用します。

于 2011-11-11T15:46:31.290 に答える
0

すべてのTCHARをwchar_tとして扱うUnicodeコンパイラスイッチを使用してアプリケーションをコンパイルしていると思います。したがって、coutはargvをintとして扱います。

代わりに書く

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

またはUse Multi-byte character、プロジェクト設定/一般で設定に変更します。

于 2011-11-11T15:53:35.920 に答える