簡體   English   中英

我可以使用 std::string* argv 作為主要 function 參數嗎?

[英]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

main參數必須是char** argvchar* argv[]

[基本.start.main]

2. 一個實現不應預定義main function。 此 function 不得超載。 其類型應具有 C++ 語言鏈接,並且應具有聲明的返回類型int ,否則其類型是實現定義的。 一個實現應允許兩者

(2.1)。 ()的 function 返回int

(2.2)。 (int, pointer to pointer to char)的function返回int


您可以做的是使用以下方法之一轉換代碼中的 arguments:

  • 簡單地分配它:
    if(argc > 1)
    { 
        std::string str = argv[1]; 
    }
  • 使用參數作為構造函數參數構造字符串:
    std::string str(argv[1]);
  • 使用初始化列表:
    std::string str{argv[1]};

如果您想保留 arguments 的集合,我建議您使用以下方法之一將它們保存在可變大小的容器std::vector中:

  • 使用std::vector構造函數就地構造向量,這里使用指向字符串數組argv開頭和結尾的指針作為構造函數 arguments:
    std::vector<std::string> strs(&argv[1], &argv[argc]); //*
  • 使用初始化列表:
    std::vector<std::string> strs{&argv[1], &argv[argc]}; //*
  • 在循環中添加 arguments:
    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構造函數來創建std::vector<std::string>

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

因此,將 arguments(不包括程序名稱)放在一個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*[]
}

不,你不能。 但是您可以使用類似以下的內容將它們存儲為std::string s

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM