程序提示用户输入存储在两个不同阵列中的两个单词。 如果单词是字谜,它会打印出“Anagram”,如果不是,则打印“Not Anagram”。我为所有字母组成了一个数组,字母'a'存储为{1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...}填充整个字母数组。
然后我比较了两个数组,以确定它们是否是我减去每个字母的相同单词,如果它们是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;
}
我很感激我能得到的任何帮助。
答案 0 :(得分:1)
bool equal_array(int counts1[26],int counts2[26])
...
for(i=0; i<30; i++)
意味着您将最终比较只有26个元素的数组的第27到第30个元素。这是(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;
}
有些人不喜欢在这样的循环中间返回,所以如果你的教授就是其中一个人,我想你需要布尔变量。但我个人觉得上面的版本更容易阅读。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
}