C++,命令行参数未正确解析

Posted

技术标签:

【中文标题】C++,命令行参数未正确解析【英文标题】:C++, command line args not being parsed properly 【发布时间】: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 中运行了该程序。

【问题讨论】:

我相信_tmain() 期待tchar 如果你在你的程序中加入main 函数,它还会发生吗? IE,你改名字后_tmain... 相关:http://***.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c 【参考方案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;

【讨论】:

或者,或者,假设始终定义_UNICODE(MBCS 构建不再需要,因为 Windows 9x 很久以前就死了),在任何地方使用wmainwchar_t。跨度> 另请注意wcout仍然不起作用,请参阅blogs.msdn.com/b/michkap/archive/2010/10/07/10072032.aspx【参考方案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 模式仅用于向后兼容。

以上是关于C++,命令行参数未正确解析的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中解析命令行参数? [关闭]

在 C++ 中解析命令行参数? [关闭]

C++解析命令行参数(仿C语言args)

C++编程:命令行参数

C++编程:命令行参数

具有互斥必需参数的命令行解析器