如何检查单词b(C lang)中单词a中的所有字符?

时间:2018-05-06 09:15:01

标签: c comparison

我想检查单词A中的每个字符是否也在单词B中。 这个功能还没有用,但我希望你能帮助我。 我创建了一个检查变量,只有当单词A中位置i的字符等于单词B中的字符i时才会增加。

int is_equal(char *a, char *b)
{
    int i = 0, j;
    int check = 0;
    while (a[i] != '\0')
    {
        for (j = 0; b[j] != '\0'; j++)
        {
            if (a[i] == b[j]) //Here
            {
                i = i + 1;
                j = 0;
                check = check + 1; //Increase
            }
            else
            {
                i = i + 1;      
                j = 0;
            }
        }
    }

    if (check % strlen(a) == 0)
    {
        return 1;
    }
    return 0;
}

在这个函数的最后,我将检查字符串a的%%长度是否为0。 如果是这样的话,A中的每个角色也都在B中。 但它不起作用,因为如果[i]和b [j]不相等,j将被重置为0并且崩溃。那么,我该如何解决这个问题呢?如何重置循环以从头开始检查?

1 个答案:

答案 0 :(得分:0)

您的代码的问题在于您决定a[]中的字符是否与嵌套循环内的b[]内的任何内容匹配。这个决定太早了,因为您的代码没有机会检查b[]中的其他字符。

您可以修改代码以引入found标志,在进入嵌套循环之前将其设置为零,然后在找到匹配项时将其设置为1:

int found = 0;
for (j = 0 ; !found && b[j] != '\0' ; j++) {
    found = a[i] == b[j];
}

循环后found的值表示b[]中的任何字符是否与a[i]匹配。

注意:这适用于短a[]b[] s,但对于非常长的字符串,它可能太慢。更好的方法是步行b[]一次,标记其中的所有字符,然后走a[]以检查是否缺少任何字符:

int seen[256] = {0};
for (int i = 0 ; b[i] ; i++) {
    // Mark characters from b[]
    seen[(unsigned char)b[i]] = 1;
}
for (int i = 0 ; a[i] ; i++) {
    // Found a char in a[] that's not in b[]
    if (!seen[(unsigned char)a[i]]) {
        return 0;
    }
}
return 1;