Карта базовой пары - перемещение argv [i] в ​​целое число или символ в качестве входных данных - PullRequest
0 голосов
/ 11 февраля 2020

Пытаясь сохранить простоту, я определяю некоторые карты базовой пары следующим образом:

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

    {

        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(static_cast<int>(c - 48)); // convert char to integer and save it in vector
            }

        for (int i : args_vector)

            {

                typedef std::map<string, int> BasePairMap;
                BasePairMap m;

                m["0"] = 48;
                m["1"] = 49;
                m["2"] = 50;
                m["3"] = 51;
                m["4"] = 52;


                char ii = static_cast<char>(i);

                int in_arg = m[argv[i]];    //works
                int in_arg = m[ii];         //does not work

            }

            return 0

    }

В более ранней версии этого проекта я передавал несколько аргументов командной строки следующим образом:

C:\MyLocation\MyExecutable.exe 4 0 1

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

C:\MyLocation\MyExecutable.exe 401

В результате теперь мне нужно вернуть 401 назад в 4 0 1 и больше не может использовать m[argv[i]] напрямую, как ранее.

Ошибки, которые я сейчас получаю в Visual Studio 2017:

Ошибка (активная) E0349 ни один оператор "[]" не соответствует этим операндам SkyQChannelChanger g: \ Visual Studio 2017 \ C ++ Проекты \ SkyQChannelChanger \ SkyQChannelChanger \ Main. cpp 147 типов операндов: BasePairMap [char]

... и:

Код серьезности Описание Подавление строки файла проекта Состояние
Ошибка C2679 бинарный '[': не найден оператор, который принимает правый операнд типа 'char' (или нет приемлемого преобразования) SkyQChannelChanger g: \ visual studio 2017 \ c ++ projects \ skyqchannelchanger \ skyqchannelchanger \ main . cpp 147

Я всего лишь пользователь C ++, работающий неполный рабочий день, но могу сказать, argv[i] - это char *, а ii - обычная char переменная, но я я не уверен в двух вещах:

  1. Почему это важно для карты пар оснований, определенной таким образом.

  2. Как (если требуется) я могу вместо ii определите char *.

Tha НКС

1 Ответ

0 голосов
/ 11 февраля 2020

Чтобы создать std::string, содержащий только один символ c, просто выполните

std::string(1, c);

(В более общем случае, конструктор string, принимающий число n и char c, приводит к n повторений c. std::string(3, 'q') имеет то же значение, что и std::string("qqq").)

Однако, похоже, вы не хотите делать это с переменной ii, которая число от нуля до девяти, а не символ, представляющий десятичное число di git (которое в большинстве кодировок представляет собой значения char от 48 до 57). Таким образом, вы можете пропустить части vector<int> и (c - 48), и просто выполните:

typedef std::map<string, int> BasePairMap;
BasePairMap m;
// Initialize m...

std::string s1 = argv[1];
for (char c : s1)
    {
        std::string digit_str(1, c);
        int in_arg = m[digit_str];
        // ...
    }
...