2016-03-08 31 views
0

請忽略該帖子的主題,因爲它可能聽起來像別的東西,而不是我在這裏實際詢問的東西。基於解析的整數代碼檢索字符串的最佳方法?

我想打一個C函數應該找回我一個具體的整數代碼的簽名將是一件很簡單的像關聯的字符串值:

char *Get_Msg (int code, char *errorInfoTable[][2]); 

所以,我需要的字符串,以及相關的代碼第一存儲因爲我不能把多個數據類型的數組,我最終也存儲碼串的條款:

char *errorInfo[][2] = { 

/* Error Code Error Message 
* ---------- ------------- */ 
    {  "0", "No error"         }, 
    {  "93", "Error in processing"      }, 
    { "-32700", "PARSE_ERROR"        }, 
    { "-32600", "INVALID_REQUEST "       }, 
}; 

然後,我可能只是閱讀此表中的函數這反過來應該返回我的關聯字符串。首先,是在該函數本身內定義該表還是作爲該文件中的全局變量的一種好方法。但是如果我希望將此功能存儲在單獨的C文件中並從其他文件中調用它,該怎麼辦?我發現如果我把這個文件聲明爲一個全局變量,我需要在主文件和函數中聲明一個extern爲char * errorInfoTable [] [2],然後在函數中解析。我想讓代碼計算解析表本身的行數。如果我嘗試計算具有Get_Msg函數的行數,這似乎不起作用,因爲函數無法從形式參數char * errorInfoTable [] [2]中看到它。我可以通過提及形式參數中的行數或者在函數中傳遞行數來做到這一點,但我不想在任何地方顯式計算行數。我想以這樣的方式設計它,程序員只需添加/刪除表中的行數,並且不應該觸及程序中任何其他地方的任何維度。

是否有任何其他方式來存儲和檢索此表中的字符串?或者其他更好的方法來實現這個功能?

+4

可以使結構數組......其成員可以是不同的數據類型。 .. – StoryTeller

+1

創建一個結構,而不是 –

回答

4
struct { int error_code; const char *message; } errorInfo[] = { 

/* Error Code Error Message 
* ---------- ------------- */ 
    { -32700, "PARSE_ERROR"        }, 
    { -32600, "INVALID_REQUEST "       }, 
    {  0, "No error"         }, 
    {  93, "Error in processing"      }, 
}; 

這應該給你你想要的。保持它的排序甚至可以讓你做對數查找。
我也會保持桌子靜止,並在Get_Msg內部。

如果你需要存儲與代碼更多的數據,你會做這樣的事情:

struct error_code_data { 
    int error_code; 
    const char *message; 
    /* More data */ 
}; 

struct error_code_data const * get_error_code_data(int error_code); 
+0

換句話說,'typedef'這個結構然後有函數返回一個這樣的結構項目。結構表應該是'const',並且實際上在函數內聲明。 – Lundin

+0

@Lundin,換句話說,這完全不同。爲了簡單快捷地將錯誤代碼轉換爲字符串,我不會添加全新的命名結構。如果需要存儲更多與代碼相關的數據,那麼我會返回'struct error_code_data *',因爲我是Linus Torvalds學派的學校,當處理大型結構定義和typedefing'struct'時。 – StoryTeller

+0

謝謝,這聽起來非常完美。你說過「我也將表保持靜態並保存在Get_Msg中」,所以這將意味着不會對錶進行多重分配(在函數的多次調用期間),並且它將保持活動直到程序結束。對? –

相關問題