这是我的代码:
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 上看到不同的输出?
最佳答案
您在 cout
的输出中看到一个地址,因为您构建的程序定义了 UNICODE
或 _UNICODE
。可能是通过 Visual Studio 项目中的设置。然后_tmain
展开为微软的非标准wmain
,_TCHAR
展开为wchar_t
。
并且 cout
不知道指向 wchar_t
的指针如何指向一个以 null 结尾的宽字符字符串。
我不确定为什么 printf
没有发生这种情况。让我检查一下。
好的,我已经检查过,您的 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] > _
换句话说,这个明显的难题完全是由于您报告的结果不准确造成的。
解决方案:不使用 Microsoft 的非标准 wmain
,特别是不使用现在完全没有意义的 Windows 9x 支持宏!,使用 标准 C++ main
。
关于c++ - 在 win32 控制台应用程序中打印参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739077/