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

时间:2016-04-23 17:34:52

标签: c anagram

这段代码部分有效,它认为某些字谜是字谜而其他字眼不是。我认为错误发生在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;
        }
    }
}

3 个答案:

答案 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 - False0-True

答案 2 :(得分:1)

我检查过你是零,有两个问题 你想要归还真是全是零,不是假。 2.检查完所有元素后,您应返回true。

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

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