2013-02-06 66 views
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不同的输出?

回答

1

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

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

我不知道为什么printf不会发生这种情况。勒姆检查。


OK我已经检查过你的printf印刷“参数”为你指明它。

下面是更正后的代码我检查:

#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] 
> _ 

换句话说,表观难题完全是由你的结果的报告不准确造成的。


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

+0

如果这是他的问题,那么'printf'会中断,因为他会尝试通过'printf'打印一个wchar_t字符串作为'char'字符串。 –

+0

_TCHAR * argv []存在问题。将其更改为const char *,现在它正常结束。 – pbibergal

+0

我没有说它打印“参数”。我用word param作为我输入的全局参数。如果我用“-v”运行程序,它会打印“-v”。所以这部分按预期工作。 – pbibergal

1

不同之处在于printf取参数的内容和强制的数据与格式说明符相匹配。由于%s格式说明符,argv[i]的内容将被视为nul终止的字符串。

cout与流插入运算符一起将根据参数的类型输出。编译器将搜索cout的所有operator<<()方法,并选择最符合参数的方法。

在你的情况,编译器正在寻找方法operator<<(TCHAR *)并没有找到完全匹配。相反,编译器认识到该参数是一个指针,并选择打印出指针的operator<<(void *)

尝试定义operator<<(TCHAR*),看看会发生什么。