我可以使用 std::string* argv 作为主函数参数吗?

Can I use std::string* argv as main function argument?

通常我看到:

int main(int argc, char** argv)

但是我可以使用:

int main(int argc, std::string* argv)

代替?

如果无法将 char* 转换为 std::string

PS: 我正在使用 C++11.

不,你不能。但是您可以使用类似下面的内容将它们存储为 std::strings

#include <iostream>
#include <string>
#include <vector>

int main(int argc,char** argv){
    std::vector<std::string> strings(argc-1);
    for(size_t i{}; i < strings.size();++i){
        strings[i] = std::string{argv[i+1]};
    }
    for(const auto& el :strings)
        std::cout << el << " ";


    return 0;
}

main 参数必须是 char** argvchar* argv[].

[basic.start.main]

2. An implementation shall not predefine the main function. This function shall not be overloaded. Its type shall have C++ language linkage and it shall have a declared return type of type int, but otherwise its type is implementation-defined. An implementation shall allow both

(2.1). a function of () returning int and

(2.2). a function of (int, pointer to pointer to char) returning int


您可以使用以下方法之一转换代码中的参数:

  • 简单赋值:
    if(argc > 1)
    { 
        std::string str = argv[1]; 
    }
  • 使用参数作为构造函数参数构造字符串:
    std::string str(argv[1]);
  • 带有初始化列表:
    std::string str{argv[1]};

如果您想保留一组参数,我建议您使用以下方法之一将它们保存在可变大小的容器中 std::vector

  • 使用 std::vector 构造函数就地构造向量,这里使用指向字符串数组 argv 开头和结尾的指针作为构造函数参数:
    std::vector<std::string> strs(&argv[1], &argv[argc]); //*
  • 使用初始化列表:
    std::vector<std::string> strs{&argv[1], &argv[argc]}; //*
  • 在循环中添加参数:
    std::vector<std::string> strs;

    for(int i = 1; i < argc; i++) //*
        strs.push_back(argv[i]);   
    }

*不包括 argv[0] 程序名称。

没有,但是标准委员会对此进行了一些讨论

在论文 P0781 中,Erich Keane 建议让标准允许以下内容:

int main(const some_container<const some_string_type> args){
  for (auto Arg : args) {
    // some usage of this character array...
  }
}

存在应使用哪种容器和哪种字符串类型的问题。 Keane 先生建议使用 string_viewinitializer_list,而不是 std::string,因为后者需要大量资源,而 string_view 非常轻量级。

不,但是您可以使用带有迭代器的 vector constructor 创建一个 std::vector<std::string>

template< class InputIt >
vector( InputIt first, InputIt last, const Allocator& alloc = Allocator());

所以要将参数(不包括程序名)放在 vector:

std::vector<std::string> args(argv + 1, argv + argc);

要将普通 main 与增强 main 分开,您可以这样做:

#include <iostream>
#include <string>
#include <vector>

int cppmain(std::string program, std::vector<std::string> args) {
    std::cout << program << " got " << args.size() << " argument(s):\n";

    for(auto& arg : args) { // each argument as a string
        std::cout << " " << arg << '\n';
    }
    return 0;
}

int main(int argc, char* argv[]) {
    //
    //         string from char*
    //                |
    //                V
    return cppmain(argv[0], {argv + 1, argv + argc});
    //                      ^                     ^
    //                      |                     |
    //                     vector<string> from char*[]
}