我想检查单词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并且崩溃。那么,我该如何解决这个问题呢?如何重置循环以从头开始检查?
答案 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;