2014-04-08 47 views
0

我正在嘗試編寫一個C程序來計算某個短語中某些字母的頻率。程序按字符讀取短語(通過存儲數組中的字符的mmap),並將當前字母與所需字母進行比較。如果匹配,則計數器遞增。但是,當運行我的代碼時,我得到了奇怪的結果。頻率不會遞增,因爲在調用strcmp時,字母不匹配,即使它們在調試中匹配。我的程序中發生了什麼導致這種行爲?C - strcmp()無法正常工作

char* data;   /* input contents from mmap */ 
    char* currChar;  /* character being compared to */ 
    char inChar;  /* character being read */ 

    ... 

    do { 
     /* get character */ 
     inChar = 0; 
     inChar = data[i]; 

     /* debug */ 
     printf("data[i] = %c, inChar = %c, &inChar = %c, currChar = %s\n", 
       data[i],  inChar,  &inChar,  currChar); 

     /* if match */ 
     if (strcmp(&inChar, currChar) == 0) { 
      /* increment frequency */ 
      freq++; 
     } 

     /* increment position */ 
     i++; 
    } while (inChar != 0); 

下面是在嘗試計算單詞「和」中「a」的頻率時的示例輸出。

data[j] = a, inChar = a, &inChar = S, currChar = a 
data[j] = n, inChar = n, &inChar = S, currChar = a 
data[j] = d, inChar = d, &inChar = S, currChar = a 
0 instances of a 
+1

你試過只檢查'INCHAR == * currChar'呢? – Baldrick

+0

currChar甚至沒有啓動。比較字符只需使用'=='運算符。 –

+0

只要有人看到某個標題說某個工具無法正常工作,那麼發生這種情況的可能性就是99.9%,即海報是新手,並且該工具正在被濫用。爲什麼會嘗試使用字符串比較函數來比較各個字符? –

回答

2

strcmp比較字符串。 &inChar不是一個字符串。

正如你所描述你的任務,你可以用

if (inChar == *currChar) 
1

strcmp需要一個「\ 0'結尾的字符串做比較。 inChar只是一個字符,在堆棧後面有一些「未知值」。

如果你只是要比較的人物,爲什麼不if (inChar == *currChar)

1

的strcmp()是比較零結尾的字符串。你沒有比較字符串。您正在比較兩個單獨的字符值的值。這裏是Reference其中指出,

「這個函數開始比較每個字符串的第一個字符,如果它們相互相等,它繼續以下對,直到字符不同或直到到達終止空字符「。

只是刪除你的strcmp函數:

if (inChar == *currChar) ... 
0

試試這個:

for(j=0;currChar[j]!='\0;j++) 
{ 
    for(i=0;data[i]!='\0';++i) 
    { 
     if(currChar[j]==data[i]) 
      ++freq; 
    } 
    printf("Frequency of %c = %d", currChar[j], freq); 
}