Разбить аргумент командной строки на аргументы / вектор с помощью C ++ - PullRequest
1 голос
/ 10 февраля 2020

У меня есть проект C ++, который ранее получал несколько аргументов командной строки с кодом, подобным следующему:

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

  for (int i = 1; i < 4; i = i + 1) {
    // do some stuff with argv[i]
    int in_arg = m[argv[i]];
  }

  return 0
}

Используя этот код, пример аргумента командной строки может быть:

C:\MyFolder\MyExecutable.exe 4 0 1

Однако из-за включения этого кода в более широкий проект моя командная строка теперь должна будет выглядеть следующим образом:

C:\MyFolder\MyExecutable.exe 401

Как я могу разбить аргумент 401 на вектор или аналог, функционально так же, как три входных аргумента типа 4 0 1, так что моя строка:

int in_arg = argv[i];

... может быть переназначена на что-то вроде:

int in_arg = new_vector[i];

Я только балуюсь с C ++, поэтому извиняюсь, если я задаю базовые c вопросы.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Если вы уже знаете, что 1-й аргумент - это простой, скопируйте его в строку и затем получите доступ к нему, используя один из параметров итерации, заданных в C ++, я использую цикл типа foreach:

#include <iostream>
#include <vector>

int main(int argc, char** argv)
{    
    if(argc < 2){
        std::cout << "Not enough arguments";  //<-- args check
        return 0;
    }
    std::string s1;
    s1 = argv[1]; //<-- copy argument to a string type to use string iterator
    std::vector<int> args_vector;

    for (char c : s1) {
        args_vector.push_back(c - '0'); // convert char to integer and save it in vector
    }

    for(int i: args_vector){ // print the args in integer format, 1 by 1
        std::cout << i << " ";
    }
    return 0;
}
0 голосов
/ 10 февраля 2020

Вы можете создать string из аргументов и просто go, хотя их символ за символом:

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

        for(char ch : arg) {             // each char in the current argument
            if(ch < 0) continue;         // skip negative char:s

            int in_arg = m[ch];          // assuming it was: int in_arg = m[*argv[i]];

            // use in_arg

        }
    }
    return 0;
}

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