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 很久以前就死了),在任何地方使用wmain
和wchar_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++,命令行参数未正确解析的主要内容,如果未能解决你的问题,请参考以下文章