C 中的 Anagram:如何知道 int 数组的每个元素是否都设置为零?

Anagram in C: How do I know if every element of the int array is set to zero?

此代码部分有效,它识别出一些变位词是变位词,而其他则不是。我认为错误发生在 isZero 中。非常感谢一些反馈。以下是每个功能的说明。

算法 读取第一个字符串,然后使用一个包含 26 个整数的数组来计算每个字母被看到的次数。 读取第二个字符串,这次减少 int 数组中每个字母的计数。当且仅当 int 数组中的每个元素都为 0 时,字符串才是变位词。 忽略任何不是字母的字符。将大写字母视为与其对应的小写字母相同。下面给出了这方面的帮助。

main() 声明两个char数组和int数组,然后调用下面描述的函数来解决问题。

初始化() 在读取第一个字符串之前清除所有 char 和 int 数组的内容。 (将 char 数组中的每个元素设置为空字符“\0”。)

getString() 提示并从输入中读取字符串。 执行此操作时调用标准库函数 gets()。

setLetters() 遍历第一个字符串中的每个字符,并更新 int 数组中该字母的计数。 执行此操作时从中调用以下标准库函数。 int isalpha & char tolower 在 setLetters() 中,您需要将“a”...“z”范围内的小写字符转换为 0..25 范围内的索引。使用这个想法: 整数索引;

index = (int) (ch – ‘a’);

checkLetters() 遍历第二个字符串中的每个字符,并从 int 数组中该字母的计数中减去 1。与 setLetters() 非常相似。

isZero() 遍历 int 数组。 Returns 当且仅当每个元素都为 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] = '[=11=]';
        string2[i] = '[=11=]';
        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;
        }
    }
}

现在你的函数 isZeroreturn True 一旦遇到 number > 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 - False0-True

我查了你isZero,两个问题 1.你要return true 是全为零,不是false。 2. 你应该 return 检查所有元素后不在第一个元素。

int isZero (int count[])
{
int i;

for (i = 0; i < MAX; i++)
{
    if (count[i])
    {
        return FALSE;
    }
}
return TRUE;
}

您的 isZero 应该如下所示。 如果数组具有非零值,您将返回 TRUE

int isZero (int count[])
{
    int i;

    for (i = 0; i < MAX; i++)
    {   
        if (count[i])
        {   
            return FALSE;
        }   
    }   
    return TRUE;
}