2009-03-04 54 views
2

使用gcc編譯C99使用strcmp比較

我想比較使用字符串比較的2個字符串。 但是,我似乎在strcmp行上得到堆棧轉儲。

**屬性將包含這些,所以我正在尋找frametype。

[name] [time] [type] [time] 
[name] [callref] [type] [string] 
[name] [port] [type] [int16] 
[name] [frametype] [type] [int16] 

這是正確的比較方式。

非常感謝您的任何建議,

void g_start_element(void *data, const char *element, const char **attribute) 
{ 
    for(i = 0; attribute[i]; i++) 
    { 
    /* Only interested in the frametype */ 
     if(strcmp(attribute[i], "frametype") == 0) 
     { 
      /* do some work here */ 
     } 

    } 
} 

回答

1

此代碼的上下文是expat解析 - see this post。屬性數組是交替的名稱和值,一個0終止。

除非你正在尋找名稱或值等於你的測試字符串的任何屬性(這有點不同尋常),那麼你的代碼應該增加2而不是1 - 這樣它就可以在名稱和一個值。

您應該比較屬性[i]匹配名稱,或匹配屬性[i + 1]以匹配值。

不要認爲屬性將以任何特定的順序。目前,您只查看屬性1,這是返回的第一個屬性的值。如果有多個屬性,可以按任意順序返回。

4

你需要有一個空字符串,以終止for循環:

[name] [time] [type] [time] 
[name] [callref] [type] [string] 
[name] [port] [type] [int16] 
[name] [frametype] [type] [int16] 
null 

沒有這個for循環將不會終止當你調用strcmp時,你最終會得到屬性[i]指向垃圾。

2
  1. 如何初始化屬性數組? NULL元素可能會滑入。
  2. 此外,數組元素必須以NULL結尾。
  3. 您可以考慮使用strncmp()作爲strcmp()的更安全替代方案。
+0

如果您將此代碼更改爲使用strncmp(),您會傳入'n'什麼?這在這種情況下會有什麼幫助? – bk1e 2009-03-06 07:31:53

1

一路添加日誌記錄並轉儲所有屬性和索引器值。這將有助於確定發生了什麼問題。

1

您的輸入數組(attribute)是否以NULL結尾?你沒有列出它的存在,但是代碼需要它,否則它會隨機存儲,這是段錯誤的一個很好的原因。

插入要比較的索引和/或屬性的打印,以查看它是否按照您期望的終止方式工作。

不太確定問題的字符串比較部分...如果輸入包含方括號等,您將不會找到任何東西,因爲您正在查看每個字符串的開始。如果是這樣,請嘗試strstr(),它會找到子字符串。

0

除了未被空終止,爲什麼不使用strncmp()? :)

0

所以你必須

if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0) 

所以你是不是取消對NULL指針我想補充的NULL檢查。