1

これが私のコードです:

int _tmain(int argc, _TCHAR* argv[])
{   
    for (int i = 1;i<argc;i++) printf("Argument %d:%s\n",i,argv[i]);
    // output = Argument 1:param

    for (int k = 1; k < argc; k++) cout << "Argument " << k << ": " << argv[k];
    // output =  Argument 1: 00BF5878
    return(0);
}

私の質問は、cout と printf で異なる出力が表示されるのはなぜですか?

4

2 に答える 2

1

またはを使用coutしてプログラムをビルドしたため、出力にアドレスが表示されます。おそらく、Visual Studio プロジェクトの設定によるものです。次に、Microsoft の非標準に展開し、 に展開します。UNICODE_UNICODE_tmainwmain_TCHARwchar_t

そして、ポインターがヌルで終わるワイド文字の文字列をcoutどのように指しているのかわかりません。wchar_t

でなぜそれが起こらないのかわかりませんprintf。レムチェック。


OK確認しましたが、あなたprintfが示しているように「param」を印刷していません

これが私がチェックした修正されたコードです:

#include <iostream>
#include <stdio.h>
#include <tchar.h>
using namespace std;

int _tmain( int argc, _TCHAR* argv[] )
{
    for( int i = 0;i < argc; ++i )
    {
        printf("printf Argument %d:%s\n",i,argv[i]);
    }

    for( int i = 0;  i < argc;  ++i )
    {
        cout << "cout Argument " << i << ": " << argv[i] << endl;
    }
}

結果は次のとおりです。

[D:\開発\テスト]
> cl foo.cpp /D _UNICODE
foo.cpp

[D:\開発\テスト]
> foo パラメータ
printf 引数 0:f
printf 引数 1:p
cout 引数 0: 004F9A9C
cout 引数 1: 004F9AA4

[D:\開発\テスト]
> _

言い換えれば、明らかな難問は完全にあなたの不正確な結果報告が原因です。


解決策: Microsoft の非標準wmainの を使用する代わりに、特に今ではまったく意味のない Windows 9x サポート マクロを使用する代わりに、標準の C++mainを使用してください。

于 2013-02-06T21:28:43.927 に答える
1

違いはprintf、パラメーターの内容を取得し、データを強制的に書式指定子に一致させることです。の内容は、書式指定子 argv[i]により、ヌルで終了する文字列として扱われます。%s

ストリーム挿入演算子と組み合わせて、パラメーターのcoutタイプに基づいて出力します。コンパイラはすべてのoperator<<()メソッドを検索しcout、パラメーターに最も一致するメソッドを選択します。

あなたの場合、コンパイラはメソッドを探していてoperator<<(TCHAR *)、完全に一致するものを見つけられませんでした。代わりに、コンパイラはパラメーターがポインターであることを認識し、ポインターoperator<<(void *)を出力するものを選択しました。

定義operator<<(TCHAR*)してみて、何が起こるか見てみましょう。

于 2013-02-06T21:46:22.757 に答える