这段代码部分有效,它认为某些字谜是字谜而其他字眼不是。我认为错误发生在isZero中。真的很感激一些反馈。以下是每项功能的说明。
算法 读取第一个字符串,然后使用26个整数的数组来计算每个字母被看到的次数。 读取第二个字符串,这次减少int数组中每个字母的计数。当且仅当int数组中的每个元素都为0时,字符串才是字符串。 忽略任何非字母的字符。将大写字母视为与小写字母相同。有关这方面的帮助如下。
主要() 声明两个char数组和int数组,然后调用下面描述的函数来解决问题。
初始化() 在读取第一个字符串之前清除所有char和int数组的内容。 (将char数组中的每个元素设置为空字符'\ 0'。)
的getString() 从输入提示和读取字符串。 在执行此操作时调用标准库函数gets()。
setLetters() 循环遍历第一个字符串中的每个字符,并更新int数组中该字母的计数。 从这里调用以下标准库函数。 int isalpha& char tolower 在setLetters()中,您需要将“a”...“z”范围内的小写字符转换为0..25范围内的索引。使用这个想法: int index;
index = (int) (ch – ‘a’);
checkLetters() 循环遍历第二个字符串中的每个字符,并从int数组中该字母的计数中减去1。与setLetters()非常相似。
isZero() 在int数组上循环。当且仅当每个元素都为0时返回TRUE,否则返回FALSE。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 26
#define TRUE 1
#define FALSE 0
void initialize (char string1[], char string2[], int count[]);
void getString (char string1[], char string2[]);
void setLetters (char string1[], int count[]);
void checkLetters (char string2[], int count[]);
int isZero (int count[]);
void main (void)
{
char string1[MAX], string2[MAX];
int count[MAX];
while (TRUE)
{
initialize (string1, string2, count);
getString (string1, string2);
setLetters (string1, count);
checkLetters (string2, count);
//printf("\n");
if (isZero(count))
{
printf("Anagram ");
}
else
{
printf("Not anagram ");
}
printf("\n");
}
}
void initialize (char string1[], char string2[], int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
string1[i] = '\0';
string2[i] = '\0';
count[i] = 0;
}
}
void getString (char string1[], char string2[])
{
printf("\n");
printf("Enter string: ");
gets(string1);
printf("Enter string: ");
gets(string2);
}
void setLetters (char string1[], int count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string1[i]))
{
string1[i] = tolower(string1[i]);
index = (int) (string1[i] - 'a');
count[index] = (count[index] + 1);
}
}
}
void checkLetters (char string2[], count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string2[i]))
{
string2[i] = tolower(string2[i]);
index = (int) (string2[i] - 'a');
count[index] = (count[index] - 1);
}
}
}
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return TRUE;
}
else
{
return FALSE;
}
}
}
答案 0 :(得分:2)
您的isZero应如下所示。
如果数组具有非零值,您将返回TRUE
。
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}
答案 1 :(得分:1)
现在,您的功能isZero
会在遇到号码&gt;时return
True
0
。所以你可以重新编写你的函数 -
int isZero (int count[])
{
int i;
for(i=0;i<MAX;i++){
if(count[i])
return 1 ; //as soon as number other than 0 is ecnountered function return 1
}
return 0; // return 0 if all elements are 0
}
注意 - 1 - False
和0-True
。
答案 2 :(得分:1)
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}