C ++,命令行args没有被正确解析

时间:2010-12-07 21:07:20

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

我有一个程序:

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

  
     

STARTING   Num输入:3   。   H   瓦特

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

有人有任何想法吗?

附加说明:通过VS2008创建它,我基本上是在互联网上复制和粘贴一个应该有效的示例。我用bash,powershell和cmd运行程序。

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

最有可能是使用UNICODE设置进​​行编译。如果定义了wcout,您应该使用cout而不是UNICODE。所有字符串都应放在_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 :(得分:4)

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

答案 3 :(得分:3)

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