2012-12-03 1 views
1

J'ai une fonction dans mon programme qui est supposé prendre l'entrée du code Morse, le comparer à un tableau de chaînes et retourner une lettre d'une chaîne correspondante une fois qu'il a trouvé le Morse correspondant. J'ai finalement réussi à le faire fonctionner sans s'écraser, mais maintenant il ne cesse de renvoyer les mauvaises lettres. Par exemple ... --- ... devrait revenir sos mais à la place je deviens amb. J'ai essayé de le tester en imprimant le numéro d'index, la chaîne de code morse et la lettre et tout a concordé, donc je pense que le problème est avec la chaîne de comparaison.Chaîne Comparer ne fonctionne pas dans C

Voici le code:

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; 
} 

Merci pour toute aide.

Edit: Désolé pour ça, voici toute la fonction.

+0

Montrez-nous la déclaration et la définition de 'letter'. On dirait que c'est un 'char', auquel cas votre appel' strcmp' est faux. Avez-vous votre niveau d'alerte relevé? Ignorez-vous les avertissements? –

+0

Oui, le problème est clairement avec string compare ... une fonction que des centaines de milliers de programmeurs ont utilisé des millions de fois sans problème. Lire "La première règle de la programmation": http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html – abelenky

+0

Je voulais dire que je pensais Je pourrais l'utiliser mal. J'apprends encore, et j'espérais que des yeux plus expérimentés m'aideraient à trouver le problème. Merci cependant, pour votre réponse polie. – user1827962

Répondre

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

Vous vouliez probablement dire 0 au lieu de 1. Ou dites simplement while (!strcmp(...)).

5

Comparez strcmp() à 0, mais pas à 1. la fonction ne retournera que 0 avec une correspondance complète. Lisez le manuel! :)

+0

Si vous voulez dire le changer en tant que (strcmp (lettre, morse [index])! = 0), j'ai essayé cela, à plusieurs reprises, et il bloque le programme. – user1827962

+5

@ user1827962: Une comparaison valide ne plantera jamais un programme, donc 'letter' est un mauvais type ou votre' count' incrémentant après la fin de 'morse' ou' alpha'. Veuillez répondre à la question que j'ai posée dans le commentaire. Dans tous les cas, la comparaison avec 1 est fausse, et je peux vous garantir que 'strcmp' n'est pas cassé. –

+0

Le programme se bloque également si vous lui fournissez un code morse qu'il ne peut pas reconnaître car 'index' sera exécuté au-delà de la fin du tableau morse []. – JvO

1

Cette déclaration:

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

écrit à letter[9] si l'entrée (mor) est de 8 caractères.

Vous avez déclaré la lettre char letter[8];, donc les seuls indices valides sont [0] - [7].

Affecter à letter[9] est probablement la cause du seg-fault que vous décrivez.

Il me semble que vous voulez que la lettre contienne jusqu'à 8 caractères de données, plus un zéro-terminateur (\0). Cela suggère que vous devriez le déclarer comme char letter[9];.

+0

C'était la source de la faute de seg. Je vous remercie de le faire remarquer. – user1827962