Я пытаюсь выучить C ++, и я учусь, делая …
Конечным результатом этого кода будет то, что он выводит char* argv[2]
к функции, которая принимает только строки в качестве входных данных, и она выведет измененную строку.
Как я могу конвертировать char* argv[2]
в строку?
Все, что я пробовал, заканчивалось тем, что по какой-то причине вылетало из командной строки
int main(int argc, char* argv[])
{
std::string com2 = argv[2];
char* com1[4];
com1[1] = "-f";
com1[2] = "--file";
com1[3] = "-t";
com1[4] = "--text";
if (strcmp(argv[1], com1[1]) == 0) {
cout << com2;
}
}
Индексы массива запускаются из 0
в N - 1
, где N
это количество элементов в массиве. Следовательно 4
недопустимый индекс и приводит к неопределенному поведению.
Убедитесь, что в программу введено правильное количество аргументов, проверив значение argc
до доступа к элементам в argv
,
com1[4]
неверно и приводит к неопределенному поведению. Массивы в C и C ++ основаны на 0, поэтому допустимые индексы для вашего массива будут 0,1,2,3
,
Локальные переменные в C и C ++ практически всегда автоматические (если не объявлено static
), что означает, что они размещены в стеке. Стек растет вниз, а массивы увеличиваются в памяти. Комбинация этих двух означает, что обычно есть что-то важное после последнего элемента любого стекового массива, и запись за ним очень опасна (это всегда опасно, но в случае стековых массивов это исключительно опасно). Назначение com1[4]
пишет за концом com1
массив, возможно перезаписывая некоторый элемент (ы) данных std::string
пример com2
или уничтожить кадр стека main
функция (зависит от того, как компилятор ставит com1
а также com2
в стеке).
Если вы запустите программу только с одним аргументом, то argv
будет иметь только 2 элемента и argv[2]
было бы:
Если вы запустите программу без каких-либо аргументов, то argv
будет иметь только 1 элемент и оба argv[1]
а также argv[2]
будет вне доступа и будет возвращать случайные значения. Чтобы предотвратить эти случаи, вы должны поместить следующее в самом начале вашей программы:
if (argc < 3) {
cerr << "ERROR: Provide at least 2 arguments" << endl;
return 1;
}
Обратите внимание, что argv
всегда имеет хотя бы один элемент (т.е. argv[0]
всегда правильная ссылка) — имя исполняемого файла. следовательно argc
всегда больше равно 1
,