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因为您已经使用UNICODE_UNICODE定义了程序。可能是通过 Visual Studio 项目中的设置。然后_tmain扩展为 MIcrosoft 的 non-standard wmain,并_TCHAR扩展为wchar_t.

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

我不确定为什么不会发生这种情况printf。让我检查一下。


好的,我已经检查过了,您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:\开发\测试]
> cl foo.cpp /D _UNICODE
foo.cpp

[D:\开发\测试]
> 富参数
printf 参数 0:f
printf 参数 1:p
cout 参数 0:004F9A9C
cout 参数 1:004F9AA4

[D:\开发\测试]
> _

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


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

于 2013-02-06T21:28:43.927 回答
1

不同之处在于它printf采用参数的内容并强制数据与格式说明符匹配。由于格式说明符 , 的内容argv[i]将被视为以 nul 结尾的字符串。%s

cout结合流插入操作符将根据参数的类型输出。编译器将搜索所有operator<<()方法cout并选择与参数最匹配的方法。

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

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

于 2013-02-06T21:46:22.757 回答