c - 如何检查单词a中单词b中的所有字符(C语言)?

标签 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 中。 但它不起作用,因为如果 a[i] 和 b[j] 不相等,j 将被重置为 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[] 效果很好,但对于很长的字符串可能就太差了。慢的。更好的方法是遍历 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;

关于c - 如何检查单词a中单词b中的所有字符(C语言)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198101/

相关文章:

c - 为什么在编写 linux 守护进程时必须与 tty 分离?

在单独的文件中创建新函数并使用头文件

c - 将类似 bash 的小部件插入 gtk

go - Golang中空接口(interface)的比较

javascript - 比较操作 - 正确的语法?

ruby - x 大于、小于还是等于值 y?

java - 哪些设置会影响已编译的 java .class 文件的布局?你怎么知道两个编译类是否相等?

c - C 中的不完整类型

c - 通过 NetLink 发送的数据大小

python - 如何针对单个值测试多个变量是否相等?