我在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
我以前测试的程序没有参数,只是使用静态值,运行得很好;所以我知道我上课没什么不对......
那我在这里做错了什么?
答案 0 :(得分:4)
argv[0]
是要调用的可执行文件的名称。
您的第一个命令行参数将位于argv[1]
。
为了确保您的程序不会再次无声地失败,您应该检查实际拥有的参数数量以及atof
是否返回值,并向用户显示相应的消息以解释问题。
答案 1 :(得分:4)
argv[0]
是程序名称。你想要argv[1]
作为第一个参数。
此外,在尝试访问argc
之前,请检查std::stoi
是否至少为2。您也可以考虑std::istringstream
,strtod
或atoi
而不是new
进行转换,因为它们可以检测到虚假输入。
最后,为什么在自动变量足够时使用{{1}}?你应该立即摆脱这种习惯,或者花费其余的时间调试内存泄漏。