2012-02-24 42 views
0

我正在嘗試編寫一個更簡單的scanf版本。我想基本上能夠對被分配一個指針無論是掃描用戶輸入這樣的:需要任何類型的輸入掃描器

int *p = (int) w_insc(); 

所以這裏是我的實現:

void *w_insc() 
{ 
    void *temp = 0; 
    scanf("???", &temp); 
    return &temp; 
} 

我很困惑,如何分配格式參數在scanf中。我也想回國,將很快被摧毀了一個變量的地址是不正確的,所以我想這樣做的:

int *p = 0; 
p = (int) w_insc((int) p); 

有人可以幫

回答

0

你是正確的,returning a pointer to a soon-to-be-destroyed variable is not correct。你可以通過返回一個指向分配給malloc的內存區域的指針來解決這個問題(儘管調用者必須記得釋放這個內存),或者通過將一個指針作爲參數指向w_insc,然後用返回的值填充指針。

但是,嘗試實現w_insc函數時存在更多更廣泛的問題。 w_insc無法知道調用者的期望。僅僅因爲來電者將w_insc的返回值轉換爲int不允許w_insc知道它應該返回int。 C函數可用的唯一信息是它的一組參數,以及程序中的全局變量(全局變量通常是解決問題的錯誤方法)。請注意,C函數有沒有辦法知道調用者將如何處理它的返回值。因此,沒有辦法編寫w_insc來取消參數,並根據調用者所做的某些轉換返回正確掃描的內容。

您可以將參數添加到w_insc,在申報入

int w_insc(const char *format, ...) 

這允許調用者在格式字符串和細節,他們希望走出標準輸入的是什麼了一系列的參數傳遞。然而,在這個實現中,你只是用另一個看起來就像scanf的函數來包裝scanf。

我的建議是:使用標準的庫函數,因爲它們是標準化的,讀過代碼的人會立即知道它的含義,而不必讀通過你描述的w_insc這樣的幾乎平凡的包裝的定義。