当解析main()函数参数时,为什么会得到地址值?

3

我正在使用Visual C++,以下是代码:

int _tmain(int argc, _TCHAR* argv[])
{

    for (int i = 0; i < argc; ++i)
    {
        cout << argv[i] << endl;
    }


    getch();
    return 0;
}

这个程序叫做 MyProgram.exe

然后我通过以下方式运行程序:MyProgram.exe hello world

该程序应该会打印出:

MyProgram.exe
hello 
world

但是它没有成功,而是打印了3行地址值:
005D1170
005D118C
005D1198

我做错了什么吗?

请参见:https://dev59.com/2m435IYBdhLWcg3w3EIi#5165240 - Martin York
4个回答

6
你需要使用:

std::wcout<<argv[i];

我猜您在编译时启用了Unicode,这样做后,_TCHAR被定义为wchar_t,因此您需要使用std::wcout版本来输出宽字符字符串。
如果您没有启用构建选项中的Unicode,则...
std::cout<<argv[i];

如果定义了_TCHARchar,那么将会很好地工作,并且有一个重载版本的<<运算符,该运算符接受一个char参数。


3

argv[i] 是一个 _TCHAR 数组,std::cout 没有针对 _TCHAR 的重载运算符 <<。它只会打印出指针。如果你正在使用 Unicode(你很可能在使用),_TCHAR 是 MSVS 用于宽字符的类型。


2
那就是为什么。如何修复它? - kuba
使用 wcout(即控制台输出的宽字符专用) 。 - dirkgently
TCHAR 可以是 charwchar_t - Martin York
@LokiAstari 是的,这取决于是否定义了UNICODE。我在我的答案中提到了这一点。 - Luchian Grigore

3

我猜测您正在使用已定义_UNICODE的编译选项。这会使得_TCHAR成为wchar_t,即宽字符。std::cout可以输出窄字符串(指char*),如果要输出宽字符串(指wchar_t*)请使用std::wcout


1

更改这行

cout << argv[i] << endl;

wcout << argv[i] << endl;

Unicode字符串是两个字符宽度的,无法由cout处理。您需要使用宽字符版本的cout来打印UNICODE字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接