【问题标题】:C++, command line args not being parsed properlyC++,命令行参数未正确解析
【发布时间】:2011-05-21 20:40:51
【问题描述】:

我有一个程序:

int _tmain(int argc, char* argv[])
{
   std::cout << "STARTING" << std::endl;
   std::cout << "Num inputs: " << argc << std::endl;

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

我希望打印出所有命令行参数。但是,输出是这样的:

./Test.exe hello world

开始 输入数:3 . H w

它似乎只查看每个参数中的第一个字符,而不是整个 char* 直到终止字符。

有人有什么想法吗?

附加说明:通过VS2008创建它,我基本上是在互联网上复制和粘贴一个应该可以工作的示例。我已经在 bash、powershell 和 cmd 中运行了该程序。

【问题讨论】:

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


【解决方案1】:

它很可能是使用UNICODE 设置编译的。如果定义了UNICODE,您应该使用wcout 而不是cout。并且所有字符串都应该放在_T()中。

#ifdef UNICODE
#define tout wcout
#else
#define tout cout
#endif 

int _tmain(int argc, TCHAR* argv[])
{
   std::tout << _T("STARTING") << std::endl;
   std::tout << _T("Num inputs: ") << argc << std::endl;

   for(int i = 0; i < argc; i++)
       std::tout << argv[i] << std::endl;

【讨论】:

【解决方案2】:

第一个字符?这闻起来就像 Unicode 被解释为 ANSI。这说得通。如果你使用 _tmain,那么你必须使用 TCHAR。

【讨论】:

    【解决方案3】:

    您的 Visual C++ 项目设置为 Unicode,并且您的主函数称为 _tmain。这意味着 Windows 调用您的函数并将 Unicode 字符串传递给您,但您使用 char* 类型将它们视为 ANSI 字符串。由于第一个 Unicode 字符的第二个字节为空,因此它显示为一个带有一个字符的 ANSI 字符串。

    【讨论】:

    • 这是正确答案。我将我的项目设置更改为多字节字符集并且它可以工作。谢谢!
    • @jbu 所以可能想将其设置为正确答案。投票按钮下方的复选框。
    • 叹息......这不正是你应该从中吸取的教训,但没关系。
    • @Noah,你是什么意思?他让我了解了 unicode 字符是如何在低级别表示的,以及为什么我的项目无法正确解析它。是否还有其他我没有学到的教训?
    • @jbu - 如果您要使用 _tmain,请遵循 _tmain 的签名。否则坚持使用标准程序入口点:main.
    【解决方案4】:

    您是否在 Unicode 模式下编译代码?

    【讨论】:

    • 这是另一个正确答案。我将我的项目设置更改为多字节字符集并且它可以工作。谢谢!
    • @jbu:不要这样做,你会失去 Unicode 功能。 MBCS 模式仅用于向后兼容。
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多