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

我之前测试过没有参数的程序,但只是使用静态值,它运行得很好;所以我知道我上的课没有错...

那么我在这里做错了什么?

4

2 回答 2

4

argv[0]是被调用的可执行文件的名称。

您的第一个命令行参数将在argv[1].

为确保您的程序不会再次静默失败,您应该检查实际有多少参数以及是否atof返回值,并向用户显示一条消息,相应地解释问题。

于 2013-10-29T09:38:32.543 回答
4

argv[0]是程序名称。你想要argv[1]第一个参数。

另外,在尝试访问它之前检查它argc至少是两个。您也可以考虑std::stoi,std::istringstream或者strtod而不是atoi转换,因为它们可以检测到虚假输入。

最后,为什么new在自动变量就足够时使用?您应该立即改掉这种习惯,或者将剩下的时间花在调试内存泄漏上。

于 2013-10-29T09:38:34.513 回答