【问题标题】:Why does my program not react to any arguments?为什么我的程序不对任何参数做出反应?
【发布时间】:2013-11-08 09:15:03
【问题描述】:

我有一个简单的 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

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

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

【问题讨论】:

  • 拜托,无论教你如何使用new,请忽略它。只写Circle c(r);,没有new,没有delete,没有指针。魔法!
  • 我专门使用 new 关键字是因为我想在堆上创建对象,而不是在堆栈上,它更安全,因为它没有堆栈溢出的风险(尽管单个对象不会做任何事情,但仍然)
  • #include "hidden_functions.h" // contains the Circle class(继续争论免费商店中手动内存管理的安全性。是的。这很有意义)
  • 提示:你对堆栈溢出的“解决方案”也比你最初“解决”的问题充满了很多更多的潜在危险。请接受 SO c++ 社区的温和鼓励,这表明您正在学习好东西:/

标签: c++ command-line-arguments argv


【解决方案1】:

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

另外,在尝试访问之前检查argc 是否至少为两个。您也可以考虑使用std::stoistd::istringstreamstrtod 而不是atoi 进行转换,因为它们可以检测到虚假输入。

最后,当自动变量就足够时,为什么还要使用new?你应该马上改掉这个习惯,或者把剩下的时间花在调试内存泄漏上。

【讨论】:

  • 我用new在堆上创建对象,而不是在栈上;这是故意的
  • @ElectricCoffee:当您确实需要动态分配时(您在这里不需要),您应该始终使用RAII,尤其是智能指针,将对象绑定到范围并确保即使抛出异常,也会释放内存。但是这里根本不需要动态对象,在不需要的时候使用堆是一个不好的习惯。
【解决方案2】:

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

您的第一个命令行参数将位于argv[1]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-10-31
    • 2021-05-02
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多