2016-07-31 2 views
-1

두 개의 다른 배열에 저장된 두 단어를 입력하라는 메시지가 표시됩니다. 단어가 아나그램이라면 "아나그램"을, 그렇지 않으면 "아나그램이 아님"을 인쇄합니다. 모든 알파벳 글자에 대한 배열을 만들었습니다. 글자 'a'는 {1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...} 글자의 전체 배열을 채 웁니다.C 두 단어가 아나그램 (내부 코드)인지 확인하는 프로그램

다음 두 배열을 비교하여 동일한 단어인지 확인한 다음 각 문자를 빼고 0 (서로 취소 함) 인 경우 Anagrams입니다. 여기까지 제 코드가 있는데, 제가 잘못하고있는 것이 확실하지 않습니다. 부울 함수에 뭔가 잘못되었다고 확신합니다.

#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에 있는지 확인하지 않으므로 사용자가 알파벳이 아닌 문자를 입력하면 함수는 count 배열의 범위를 벗어나는 임의의 임의의 바이트를 수정하여 위와 같이 정의되지 않은 동작으로.


마지막으로, 쓰기 조금 짧은 것 : 어떤 사람들은 그런 루프의 중간에 수익을 좋아하지 않는

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; 
    } 
} 
관련 문제