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



这是我的代码:

int _tmain(int argc, _TCHAR* argv[])
{   
    for (int i = 1;i<argc;i++) printf("Argument %d:%sn",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扩展到MIcrosoft的非标准wmain_TCHAR扩展到wchar_t

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

我不知道为什么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:%sn",i,argv[i]);
    }
    for( int i = 0;  i < argc;  ++i )
    {
        cout << "cout Argument " << i << ": " << argv[i] << endl;
    }
}

结果是:

[D:\dev\test]>cl foo.cpp/D _UNICODEfoo.cpp[D:\dev\test]>foo参数printf参数0:fprintf参数1:pcout参数0:004F9A9Ccout参数1:004F9AA4[D:\dev\test]>_

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


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

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

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

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

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

最新更新