这个验证通知名称是否等于其他名称的功能如何工作

How does this function that verify if a informed name is equal to other name works

我一直在寻找 C 语言的代码来验证两个字符串是否相等。我找到了这个,但我不明白 forwhile 部分的逻辑。

int verify(phonebook name[],char name_verify[])
{
    int i,k;

    char *p,temp[strlen(name_verify)];

    if(strlen(name) >= strlen(name_verify))
    {
        for(i=0; i<=(strlen(name) - strlen(name_verify)) ; i++)
        {
            p=&name[i];
            k=0;
            
            while(k!=strlen(name_verify))
            {
                temp[k] =* (p + k);
                k++;
            }
            temp[k]='[=10=]';

            if(strcmp(strupr(temp),strupr(name_verify))==0)
            {
                return 1;
            }
        }
    }

有人可以向我解释一下它是如何工作的吗?

对于初学者函数的声明

int verify(phonebook name[],char name_verify[])

令人困惑,因为不清楚类型说明符 phonebook 的含义。所以函数的 reader 需要调查函数体假设 phonebook 是类型 char.

的同义词

可变长度数组的声明

char *p,temp[strlen(name_verify)];

可能是未定义行为的原因,因为它没有 space 来存储字符串 name_verify.

的终止零字符 '\0'

你必须写

char *p,temp[strlen(name_verify) + 1];

但是使用可变长度数组可能是堆栈溢出的原因。使用这个数组是完全多余的。不用它也能写出函数。

在函数中有许多函数的冗余调用 strlen

该函数尝试检查字符串 name 自身是否包含等于字符串 name_verify 的子字符串是否将两者都转换为大写。

首先函数检查字符串 name 的长度是否不小于字符串 name_verify.

的长度
if(strlen(name) >= strlen(name_verify))

然后在for循环中

for(i=0; i<=(strlen(name) - strlen(name_verify)) ; i++)

开始遍历字符串name,判断字符串name中从索引i开始的子串是否等于字符串name_verify。

为此,将字符串名称的子字符串复制到数组 temp

        p=&name[i];
        k=0;
        
        while(k!=strlen(name_verify))
        {
            temp[k] =* (p + k);
            k++;
        }
        temp[k]='[=15=]';

复制完成后,将数组 temp 中形成的字符串与字符串 name_verify.

进行大写比较
        if(strcmp(strupr(temp),strupr(name_verify))==0)
        {
            return 1;
        }

如果它们相等则函数return 1.

否则,如果字符串 name 中没有等于 name_verify 的子串,则函数 returns 0 似乎在 return 提供的代码中未显示的语句。:)

关于“这是一个糟糕的代码”,我想说的主要原因是它的功能不必要地复杂,以至于我可以相信它被故意混淆了,并且它没有使用适用的明显标准库函数。为了演示,这是我编写函数的一种方式:

int verify(const char name[], char name_verify[]) {
    char temp = strdup(name);
    int result = ((strstr(strupr(temp), strupr(name_verify))) != NULL);

    free(temp);
    return result ;
}

这(这么多!)更清晰。

如果你碰巧没有strdup()(由POSIX指定,而不是C语言规范)那么你总是可以实现自己的:

char *strdup(const char *src) {
    char *result = malloc(strlen(src) + 1);

    if (result) {
        strcpy(result, src);
    }

    return result;
}