2014-09-23 53 views
0

我正在讀取每行有十六進制值的文件。它看起來像這樣:如何將特定的字符串與C中數組的所有元素進行比較?

F0BA3240C 
083FA52 
45D3687AF 
etc. 

十六進制值不會有相同的長度。

我把fgets從這個文件讀入一個緩衝區,然後是一段代碼來擺脫換行符。從那裏我把緩衝區中的字符串放入我的數據數組中。但在將字符串從緩衝區放入我的數據數組之前,我試圖比較緩衝區中的字符串和已存儲在數據數組中的字符串,看看是否存在匹配,以便更新某些計數器。但是,我遇到了使用strcmp和strncmp的問題。任何幫助將不勝感激,謝謝。

相關代碼:

char **data = NULL; 
char data_buffer[100]; 

//program first goes through the file and determines amount of lines there are hence this variable 
int count_line    = 0; 
... 
data = malloc(count_line * sizeof(char *)); 
int f; 
int i; 
for(i=0; i<count_line; i++) 
    { 
     fgets(data_buffer, sizeof(data_buffer), fp); 

     ... 

     //allocate space to store copy of line and add one for null terminator 
     data[i] = malloc(line_length + 1); 

     ... 
     if(asdf != NULL) 
     { 
      //problem here. don't know how to compare stream from buffer and compare to all elements of data buffer 
      for(f=0; f<sizeof(data); f++) 
      { 
       if(strcmp(data[f], data_buffer) == 0) 
        there_was_a_match++; 
      } 

     } 
     ... 
     //copy string from buffer into data array 
     strcpy(data[i], data_buffer); 
} 

回答

0

考慮這些行:

 for(f=0; f<sizeof(data); f++) 
     { 
      if(strcmp(data[f], data_buffer) == 0) 
       there_was_a_match++; 
     } 

什麼是sizeof(data)價值?由於data的類型是char**,推測是 sizeof(data)是指針的大小,以字節爲單位,所以有些固定的整數值,例如4或8. 現在觀察您第一次在「for i」循環內遇到此循環, i爲0,data[0]是分配的指針數組中唯一的指針 - data中的每個其他指針都是無效的。 所以現在發生的是,我們做內循環的第一次迭代:f是0,所以我們 最終比較我們剛剛閱讀的字符串本身。 在下一次迭代中,f爲1,我們嘗試將我們的最新字符串與, 進行比較,但尚未初始化, ergo我們有未定義的行爲(例如崩潰)。

 for(f=0; f<i; ++f) 
     { 
      if(strcmp(data[f], data_buffer) == 0) 
       there_was_a_match++; 
     } 

這樣一來,你就比較最新的字符串(你剛纔保存在data[i]) 只有那些已經字符串:

如果f迴路都像這樣你可能會更好加載。

還有一件事情可能很麻煩。假設您的輸入包含四個相同字符串的 副本。 然後,當您讀取第二個副本並執行此循環後,there_was_a_match將爲1; 讀取第三個副本並執行該循環後,there_was_a_match將會是3 (因爲它匹配兩次); 在讀完第四個副本並執行該循環後,there_was_a_match將會是6. 我懷疑這些不是您想要的結果。 也許你想在找到第一場比賽後跳出循環。

+0

非常有幫助,感謝您的解釋。 – Kevin 2014-09-23 20:59:37

0

我不能看到STRCMP/strcpy的問題,而是:

for(f=0; f<sizeof(data); f++) 

您不容使用sizeof,即。它不會導致count_line的值。
從顯示的代碼,這可能足以使其工作。

+0

如果我將其更改爲某個整數,例如50不幸的是,它仍然不起作用。 – Kevin 2014-09-23 20:19:18

+0

也許描述你遇到的問題? – deviantfan 2014-09-23 20:21:59

+0

我使用Pelles C,當試圖編譯時,我沒有得到任何錯誤,但是當我嘗試運行代碼時它崩潰了。如果我取出** if(strcmp(data [f],data_buffer)== 0)**,它會執行正常。 – Kevin 2014-09-23 20:28:04

0

只是比較以前分配的行,這是i行。

// for(f=0; f<sizeof(data); f++) 
for(f=0; f<i; f++) 
+0

完美,謝謝! – Kevin 2014-09-23 20:58:27

相關問題