Что не так с этим кодом? (Преобразование символа * в строку)

Я пытаюсь выучить 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;
}
}

2

Решение

Индексы массива запускаются из 0 в N - 1, где N это количество элементов в массиве. Следовательно 4 недопустимый индекс и приводит к неопределенному поведению.

Убедитесь, что в программу введено правильное количество аргументов, проверив значение argcдо доступа к элементам в argv,

6

Другие решения

com1[4] неверно и приводит к неопределенному поведению. Массивы в C и C ++ основаны на 0, поэтому допустимые индексы для вашего массива будут 0,1,2,3,

1

Локальные переменные в 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,

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector