在win32控制台应用程序中打印参数

时间:2013-02-06 21:24:05

标签: c++ visual-c++

这是我的代码:

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上看到不同的输出?

1 个答案:

答案 0 :(得分:1)

您在cout的输出中看到了一个地址,因为您已经定义了UNICODE_UNICODE的程序。可能通过Visual Studio项目中的设置。然后_tmain扩展为MIcrosoft的非标准wmain_TCHAR扩展为wchar_t

并且cout不知道指向wchar_t的指针应该指向以空字符结尾的宽字符串。

我不确定为什么printf不会发生这种情况。 Lemme check。


好的,我已经检查了,你的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:\dev\test]
> cl foo.cpp /D _UNICODE
foo.cpp

[D:\dev\test]
> foo param
printf Argument 0:f
printf Argument 1:p
cout Argument 0: 004F9A9C
cout Argument 1: 004F9AA4

[D:\dev\test]
> _

换句话说,明显的难题完全是由于您对结果的报告不准确造成的。


解决方案:使用标准C ++ wmain ,而不是使用Microsoft的非标准main,而不是使用现在完全没有意义的Windows 9x支持宏!