У меня есть простая тестовая программа в 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
Я ранее тестировал программу без параметра, но просто использовал статические значения, и он работал нормально; поэтому я знаю, что ничего не случилось с классом, который я сделал...
Так что же я сделал не так?
argv[0]
- это имя программы. Вы хотите, чтобы argv[1]
для первого аргумента.
Кроме того, проверьте, что argc
не менее двух, прежде чем пытаться получить к нему доступ. Вы можете также рассмотреть std::stoi
, std::istringstream
или strtod
а не atoi
для преобразования, поскольку они могут обнаруживать фиктивные входные данные.
И, наконец, зачем использовать new
когда будет достаточно автоматической переменной? Вы должны немедленно выйти из этой привычки или провести остаток вечности, отлаживая утечки памяти.
argv[0]
- это имя исполняемого исполняемого файла.
Ваш первый параметр командной строки будет в argv[1]
.
Чтобы убедиться, что ваша программа снова не работает, вы должны проверить, сколько параметров у вас есть, и если atof
возвращает значение и покажет сообщение пользователю, объясняющему проблему соответствующим образом.
new
, игнорируйте это. Просто напишитеCircle c(r);
, нетnew
, нетdelete
, нет указателей. Магия!