2012-12-03 63 views
1

我在程序中有一個函數,它應該採用莫爾斯碼輸入,將它與字符串數組進行比較,並在找到匹配的莫爾斯後從對應字符串返回一個字母。我終於設法讓它在沒有崩潰的情況下運行,但現在它不斷返回錯誤的字母。例如...... --- ...應該返回sos,但是我得到了amb。我試圖通過打印索引號,莫爾斯碼字符串和字母來測試它,並且它們都匹配起來,所以我認爲問題在於字符串比較。字符串比較不能在C中工​​作

下面的代碼:

void morsetotext(char mor[]) 
{ 
    char alpha[]={"abcdefghijklmnopqrstuvwxyz1234567890 "}; 
    char *morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", 
    "..", ".---","-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", 
    "...", "-", "..-", "...-",".--", "-..-", "-.--", "--.","-----", ".----", 
    "..---", "...--", "....-",".....", "-....", "--...", "---..", "----." "/ "}; 
    char letter[8]; 
    char convert[250]; 
    int con_count=0; 
    int let_count=0; 
    int count=0; 
    int index=0; 
    int length=strlen(mor); 

    while (count<length) 
    { 
      for(let_count=0; let_count<8 && mor[count]!=' '; let_count++) 
      { 
          letter[let_count]=mor[count]; 
          count++; 
      } 

      letter[let_count+1]='\0'; 

      index=0; 
      while (strcmp (letter, morse[index])!=1) 
      { 
       index++; 
      } 

      count++; 

      printf ("%c", alpha[index]); 
    } 
    return; 
} 

感謝您的幫助。

編輯:對不起,這是整個功能。

+0

向我們展示'letter'的聲明和定義。聽起來它可能是一個'char',在這種情況下,你對'strcmp'的調用是錯誤的。你有警告級別嗎?你是否忽略了任何警告? –

+0

是的,問題很明顯,字符串比較......數百萬程序員使用數百萬次而沒有問題的函數。閱讀「編程的第一條規則」:http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html – abelenky

+0

我的意思是我認爲我可能會錯誤地使用它。我還在學習,我希望有更多經驗的眼睛幫助我找到問題。謝謝你,禮貌的迴應。 – user1827962

回答

5
while (strcmp (letter, morse[index])!=1) 

您可能指的是0而不是1。或者只是說while (!strcmp(...))

5

將strcmp()與0進行比較,而不是1.該函數只會返回0且完全匹配。閱讀手冊! :)

+0

如果你的意思是把它改爲while(strcmp(letter,morse [index])!= 0),我已經試過了,反覆,並且使程序崩潰。 – user1827962

+5

@ user1827962:一個有效的比較永遠不會使程序崩潰,所以'letter'是錯誤的類型或者是在'morse'或'alpha'末尾增加'count'。請回答我在評論中提問的問題。無論哪種方式,與1比較是錯誤的,我可以向你保證'strcmp'沒有被破壞。 –

+0

該程序也會崩潰,如果你餵它一個莫爾斯碼,它不能識別,因爲'索引'將超出莫爾斯[]數組的末尾。 – JvO

1

本聲明:

letter[let_count+1]='\0'; 

被寫入letter[9]如果輸入(mor)是8個字符長。

您聲明的字母爲char letter[8];,所以唯一有效的標記是[0] - [7]。

指定給letter[9]最有可能導致您描述的seg-fault。

在我看來,你希望字母最多包含8個數據字符,再加上一個空終止符(\0)。這表明你應該宣佈它爲char letter[9];

+0

這是seg-fault的來源。謝謝你指出。 – user1827962