2016-07-31 5 views
-1

プログラムは、2つの異なる配列に格納された2つの単語を入力するように求めます。 単語がアナグラムの場合は「アナグラム」を、そうでない場合は「アナグラムでない」を印刷します。私はすべてのアルファベット文字の配列を作った、文字 'a'は{1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...}文字の全体の配列を埋めるように格納されます。C 2つの単語がアナグラム(内部のコード)であるかどうかを調べるプログラム

次に、両方の配列を比較して、それらが同じ文字であるかどうかを調べて、それぞれの文字を差し引いたかどうかを判断し、0であればそれらはアナグラムです。 これまでの私のコードは、私が間違っているのか分かりません。ブール関数に何か間違いがあると私は確信しています。

#include <stdio.h> 
#include <stdbool.h> 
#include <ctype.h> 

void read_word(int counts[26]) 
{ 
    int i; 
    char ch; 

    printf("Enter a word: "); 
    for(i=0;(ch=getchar()) != '\n' && i<30; i++) 
     counts[toupper(ch)-'A']++; 
} 

bool equal_array(int counts1[26],int counts2[26]) 
{ 
    int i; 
    bool is_anagram=false; 
    for(i=0; i<30; i++) 
    { 
     counts1[i]= counts1[i] - counts2[i]; 
     if(counts1[i] == 0) 
      { 
       is_anagram=true; 
      } 
     else 
     { 
      is_anagram=false; 
      break; 
     } 

    } 
    return is_anagram; 
} 

int main() 
{ 

    int first_word[26]={0}; 
    int second_word[26]={0}; 


    read_word(first_word); 

    read_word(second_word); 


    if(equal_array(first_word,second_word) == true) 
     printf("Anagram"); 
    else 
     printf("Not Anagram"); 

    return 0; 
} 

ご迷惑をおかけして申し訳ありません。

答えて

1
bool equal_array(int counts1[26],int counts2[26]) 
... 
for(i=0; i<30; i++) 

あなたが唯一の26の要素を持つ配列の30番目の要素を通じて27日を比較することになりますことを意味します。それは(1)未定義の動作、(2)明白なバグ、(3)クラッシュして焼き付かないと間違った結果を生む可能性があります。


あなたはどちらかあなたの読み取りループに30文字の制限を持っている理由私は表示されません。あなたはどこにでも単語を格納していないので、長さを任意に制限する理由はありません。一方、文字が実際に範囲A .. Zであることを確認しないので、アルファベット以外の文字を入力すると、関数はカウント配列の範囲外のいくつかのランダムなバイトを修正し、上記のように、未定義の振る舞いに


最後に、書くことが少し短くなります

bool equal_array(int counts1[26],int counts2[26]) { 
    int i; 
    for(i=0; i<26; i++) { 
     if(counts1[i] != counts2[i]) return false; 
    } 
    return true; 
} 

あなたの教授は、私もその一人であるかのように、一部の人々は、そのようなループの途中でリターンを好きではありませんブール変数が必要であるとします。しかし、個人的に私は上記のバージョンを読みやすくしています。

0
bool equal_array(int counts1[26],int counts2[26]) 
{ 
    int i; 
    bool is_anagram=true; 
    for(i=0; i<26; i++)//30 : occures out of bounds 
    { 
     if(counts1[i] != counts2[i]) 
     { 
      is_anagram=false; 
      break; 
     } 
    } 
    return is_anagram; 
} 
0
class Program 
{ 
    public static void Main(string[] args) 
    { 
     string firstWord = String.Empty; 
     string secondWord = String.Empty; 
     Console.WriteLine("Check if two strings are anagrams"); 
     Console.WriteLine("Enter First String"); 
     firstWord = Console.ReadLine(); 
     Console.WriteLine("Enter Second String"); 
     secondWord = Console.ReadLine(); 
     Console.WriteLine(); 
     Console.WriteLine("Ara Anagram: " + AreAnagrams(firstWord.ToLower(), secondWord.ToLower()).ToString()); 
     Console.ReadLine(); 
    } 

    private static bool AreAnagrams(string firstWord, string secondWord) 
    { 
     if (firstWord.Length == 0 || firstWord.Length != secondWord.Length) 
      return false; 

     string letters = new String(firstWord.Distinct().ToArray()); 

     foreach (char letter in letters) 
     { 
      char lowerLetter = Char.ToLower(letter); 
      if (firstWord.Count(c => c == lowerLetter) != secondWord.Count(c => c == lowerLetter)) return false; 
     } 
     return true; 
    } 
} 
関連する問題