这个验证通知名称是否等于其他名称的功能如何工作
How does this function that verify if a informed name is equal to other name works
我一直在寻找 C 语言的代码来验证两个字符串是否相等。我找到了这个,但我不明白 for
和 while
部分的逻辑。
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;
}
我一直在寻找 C 语言的代码来验证两个字符串是否相等。我找到了这个,但我不明白 for
和 while
部分的逻辑。
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
.
你必须写
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;
}