【问题标题】:How to get std::string from command line arguments in win32 application?如何从 win32 应用程序中的命令行参数获取 std::string?
【发布时间】:2011-05-07 07:21:07
【问题描述】:

所以现在我有一个

int main (int argc, char *argv[]){}

如何使它基于字符串? int main (int argc, std::string *argv[]) 够吗?

【问题讨论】:

    标签: c++ string command-line arguments std


    【解决方案1】:

    没有。这是不允许的。如果存在,则强制为 char *argv[]。

    顺便说一句,在 C++ 中 main 应始终声明为返回 'int'

    【讨论】:

      【解决方案2】:

      main 接收 char*。您必须自己将 argv 数组放入 std::strings 中。

      【讨论】:

      • main 没有传递任何东西。相反,CRT 将 main 传递给 char*
      【解决方案3】:

      你不能那样做,因为 main 函数是显式声明的,因为它是一个入口点。请注意,CRT 对 STL 一无所知,所以无论如何都会呕吐。试试:

      #include <string>
      #include <vector>
      
      int main(int argc, char* argv[])
      {
          std::vector<std::string> args;
          for(int i(0); i < argc; ++i)
              args.push_back(argv[i]);
      
          // ...
      
          return(0);
      }; // eo main
      

      【讨论】:

      • 誓言。就像 i(0) 语法 +1
      • 由于您知道结果向量的大小,您可以使用向量的大小构造函数进行预分配,避免使用 .push_back() 进行可能的多次重新分配。你也可以使用vector的迭代器构造函数来避免自己编写循环。
      • @luke,是的,我看到了你的回复并 +1 了,因为它比我的干净得多。
      【解决方案4】:

      那将是非标准的,因为3.6.1 中的标准说

      实现不应预定义主要功能。此函数不得重载。它的返回类型应该是 int 类型,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

      int main() { /* ... */ }

      int main(int argc, char* argv[]) { /* ... */ }

      【讨论】:

      • @Chubsdad : 我用福昕;-)
      【解决方案5】:

      你不能改变 main 的签名,所以这是你最好的选择:

      #include <string>
      #include <vector>
      
      int main(int argc, char* argv[])
      {
          std::vector<std::string> params(argv, argv+argc);
          // ...
          return 0;
      }
      

      【讨论】:

      • 是的,+1 来自我,虽然通常你想要argv+1, argv+argc(因为argv+0 是应用程序名称)。
      • @sbi,是的-记住这一点很重要,但我试图保持简单:)
      【解决方案6】:

      如果你想从传递的输入参数中创建一个字符串,你也可以 添加字符指针以自己创建字符串

      #include <iostream>
      #include <string>
      using namespace std;
      
      int main(int argc, char* argv[])
      {
      
      string passedValue;
      for(int i = 1; i < argc; i++)
       passedValue += argv[i];
          // ...
          return 0;
      }
      

      【讨论】:

      • +=”会将它们混合在一起。 passedValue.append(argv[i]).append(" ") 会更好看。
      猜你喜欢
      • 2013-07-28
      • 2021-04-30
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多