Почему моя программа не реагирует ни на какие аргументы?

0

У меня есть простая тестовая программа в C++, которая печатает атрибуты круга

#include <iostream>
#include <stdlib.h>
#include "circle.h" // contains the Circle class

using namespace std;

void print_circle_attributes(float r) {
    Circle* c = new Circle(r);
    cout << "radius: " << c->get_radius() << endl;
    cout << "diameter: " << c->get_diameter() << endl;
    cout << "area: " << c->get_area() << endl;
    cout << "circumference: " << c->get_circumference() << endl;
    cout << endl;
    delete c;
}

int main(int argc, const char* argv[]) {
    float input = atof(argv[0]);
    print_circle_attributes(input);
    return 0;
}

когда я запускаю свою программу с параметром 2.4 она выводит:

radius: 0.0
diameter: 0.0
area: 0.0
circumference: 0.0

Я ранее тестировал программу без параметра, но просто использовал статические значения, и он работал нормально; поэтому я знаю, что ничего не случилось с классом, который я сделал...

Так что же я сделал не так?

  • 2
    Пожалуйста, все, что научило вас использовать new , игнорируйте это. Просто напишите Circle c(r); , нет new , нет delete , нет указателей. Магия!
  • 0
    Да, и здесь есть хорошие учебные материалы .
Показать ещё 11 комментариев
Теги:
command-line-arguments
argv

2 ответа

4
Лучший ответ

argv[0] - это имя программы. Вы хотите, чтобы argv[1] для первого аргумента.

Кроме того, проверьте, что argc не менее двух, прежде чем пытаться получить к нему доступ. Вы можете также рассмотреть std::stoi, std::istringstream или strtod а не atoi для преобразования, поскольку они могут обнаруживать фиктивные входные данные.

И, наконец, зачем использовать new когда будет достаточно автоматической переменной? Вы должны немедленно выйти из этой привычки или провести остаток вечности, отлаживая утечки памяти.

  • 0
    Я использовал new для создания объекта в куче, а не в стеке; это было сделано специально
  • 2
    @ElectricCoffee: Когда вам действительно нужно динамическое выделение (чего у вас нет), вы всегда должны использовать RAII , в частности умные указатели, чтобы привязать объект к области и убедиться, что память освобождена, даже если исключение составляет выброшены. Но вам вообще не нужен динамический объект, и использование кучи, когда вам это не нужно, является плохой привычкой.
4

argv[0] - это имя исполняемого исполняемого файла.

Ваш первый параметр командной строки будет в argv[1].

Чтобы убедиться, что ваша программа снова не работает, вы должны проверить, сколько параметров у вас есть, и если atof возвращает значение и покажет сообщение пользователю, объясняющему проблему соответствующим образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню