【问题标题】:Why gets address value when parsing main() arguments?为什么在解析 main() 参数时获取地址值?
【发布时间】:2012-05-11 16:18:02
【问题描述】:

我正在使用带有以下代码的 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

我是不是做错了什么?

【问题讨论】:

标签: c++ command-line-arguments main


【解决方案1】:

你需要使用:

std::wcout<<argv[i];

我猜你在编译中启用了 Unicode,当你这样做时,_TCHAR 被定义为wchar_t,因此你使用std::wcout 版本来输出宽字符字符串。

如果您没有在构建选项中启用 Unicode,那么

std::cout<<argv[i];

可以正常工作,因为 _TCHAR 被定义为 char 并且有一个 &lt;&lt; 运算符的重载版本,它采用 char 参数。

【讨论】:

    【解决方案2】:

    我猜你是在定义 _UNICODE 的情况下编译它。这使得_TCHAR 成为wchar_t,一个宽字符。 std::cout 可以输出窄字符串(如char* 所指)。要输出宽字符串(如wchar_t* 所指),请使用std::wcout

    【讨论】:

      【解决方案3】:

      argv[i] 是一个_TCHAR 数组,std::cout 没有operator &lt;&lt;_TCHAR 的重载。它只是打印出指针。 _TCHAR 是用于宽字符的 MSVS 类型(如果您使用的是 unicode,则很可能是这样)。

      【讨论】:

      • 这就是原因。如何解决?
      • 使用wcout(即控制台输出的宽字符特化)。
      • TCHAR 可以是charwchar_t
      • @LokiAstari 是的,取决于是否定义了 UNICODE。我把它放在我的答案中。
      【解决方案4】:

      换行

      cout << argv[i] << endl;
      

      wcout << argv[i] << endl;
      

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

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 2013-12-22
        • 2021-10-26
        • 2022-07-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多