2013-10-19 52 views
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("&amp;", 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仍然很陌生,而且我是全新的。

+1

當然你會在任何地方提交之前單元測試這個函數。不要滿足於這些,但基本測試必須測試空,空,「%a」,「a%」,「a」,「%」。我希望其中的三個可以進行段錯誤。是的,肯定有泄漏,就在你認爲有泄漏的地方。但是,是的,插入'\ 0'是截斷C字符串的完美方式。 – Salt

+1

ptomato回答了截斷部分。至於泄漏,你泄露了g_strjoinv和g_strsplit的返回值。您應該將結果保存到臨時變量中,然後使用該值調用g_printf,然後調用g_free和g_strfreev。 – nemequ

回答

1

gcharchar完全一樣,所以無論你在這裏做什麼都適用於普通的C字符串。

當你在一個字符串上調用free()g_free()時,它不計算strlen()以找出要釋放多少內存;它釋放了儘可能多的內存分配在該地址。否則,你永遠不能釋放沒有指定分配內存長度的指針。所以截斷字符串是安全的。

相關問題