2013-10-29 81 views
0

我有C++運行我的程序與參數2.4其輸出打印出一個圓圈爲什麼我的程序不會對任何參數做出反應?

#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; 
} 

的屬性,一個簡單的測試程序:

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

我以前測試程序沒有參數,但只是使用靜態值,它運行得很好;所以我知道我的班級沒什麼問題...

那麼我在這裏做錯了什麼?

+2

請教你如何使用'new',無視它。只需寫出'Circle c(r);',否'new',否'delete',無指針。魔法! –

+0

哦,這裏有很好的學習資料(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

我特別使用new關鍵字,因爲我想在堆上創建對象,而不是在堆棧上,所以它更安全,因爲它不會冒棧溢出的風險(雖然單個對象不會做任何事情,但仍然) –

回答

4

argv[0]是程序名稱。您需要argv[1]作爲第一個參數。

另外,在嘗試訪問它之前,請檢查argc是否至少有兩個。您也可以考慮使用std::stoi,std::istringstreamstrtod而不是atoi進行轉換,因爲它們可以檢測僞造輸入。

最後,爲什麼在自動變量就足夠時使用new?你應該馬上擺脫這種習慣,或者花費其餘的時間來調試內存泄漏。

+0

我用new來創建堆上的對象而不是堆棧;它的目的完成 –

+2

@ElectricCoffee:當你確實需要動態分配(你不在這裏)時,你應該總是使用[RAII](http://en.wikipedia.org/wiki/),特別是智能指針,將對象綁定到作用域,並確保釋放內存,即使引發異常也是如此。但是你根本不需要動態對象,而在你不需要時使用這個堆是一個不好的習慣。 –

4

argv[0]是被調用的可執行文件的名稱。

你的第一個命令行參數將在argv[1]

要確保你的程序不默默地再次失敗,你應該檢查你實際上有多少參數有,如果atof返回一個值,並顯示一條消息給用戶相應的解釋問題。

相關問題