1
我試圖重構/修復一個函數,並且我做了正確的截斷嗎?如果不是,通常應該怎麼做?特別想知道潛在的泄漏。C/Glib,我正確截斷這個gchar數組嗎?
void process_entry(GMenuTreeEntry *entry)
{
char *name = g_strdup (gmenu_tree_entry_get_name(entry));
char *exec = g_strdup (gmenu_tree_entry_get_exec(entry));
int i;
for (i = 0; i < strlen(exec) - 1; i++) {
if (exec[i] == '%')
{
switch (exec[i+1]) {
case 'f': case 'F':
case 'u': case 'U':
case 'd': case 'D':
case 'n': case 'N':
case 'i': case 'c': case 'k': case 'v': case 'm':
exec[i-1] = '\0';
i++;
break;
}
}
}
g_printf("<item label=\"%s\">\n", g_strjoinv("&", g_strsplit(name,"&",0))),
g_printf("<action name=\"Execute\"><command>%s</command></action>\n", exec),
g_printf("</item>\n");
g_free(name);
g_free(exec);
}
這是一些GPL代碼,非常感謝您的幫助。一般來說,我對C仍然很陌生,而且我是全新的。
當然你會在任何地方提交之前單元測試這個函數。不要滿足於這些,但基本測試必須測試空,空,「%a」,「a%」,「a」,「%」。我希望其中的三個可以進行段錯誤。是的,肯定有泄漏,就在你認爲有泄漏的地方。但是,是的,插入'\ 0'是截斷C字符串的完美方式。 – Salt
ptomato回答了截斷部分。至於泄漏,你泄露了g_strjoinv和g_strsplit的返回值。您應該將結果保存到臨時變量中,然後使用該值調用g_printf,然後調用g_free和g_strfreev。 – nemequ