Pointers 字符串比较执行缓慢

Pointers 字符串比较执行缓慢,pointers,strcmp,Pointers,Strcmp,我的问题是为什么我的程序要花很多时间来执行,这个程序应该检查用户密码,使用的方法是 将控制台中的密码输入到数组中,然后 将其与以前保存的密码进行比较 比较由函数str_cmp()完成-如果字符串相等,则返回零;如果字符串不相等,则返回非零 #include<stdio.h> char str_cmp(char *,char *); int main(void) { int i=0; char c,cmp[10],org[10]="0123456

我的问题是为什么我的程序要花很多时间来执行,这个程序应该检查用户密码,使用的方法是 将控制台中的密码输入到数组中,然后 将其与以前保存的密码进行比较 比较由函数str_cmp()完成-如果字符串相等,则返回零;如果字符串不相等,则返回非零

  #include<stdio.h>
  char str_cmp(char *,char *);
  int main(void)
  {
      int i=0;
      char c,cmp[10],org[10]="0123456789"; 
      printf("\nEnter your account password\ntype 0123456789\n");
      for(i=0;(c=getchar())!=EOF;i++)
      cmp[i]=c;
      if(!str_cmp(org,cmp))
      {
          printf("\nLogin Sucessful");  
      }
      else
          printf("\nIncorrect Password");
  return 0;
  }
  char str_cmp(char *porg,char *pcmp)
  {
    int i=0,l=0;
    for(i=0;*porg+i;i++) 
    {
        if(!(*porg+i==*pcmp+i))
        {
          l++;
        }        
    }
  return l;
  }
#包括
char str_cmp(char*,char*);
内部主(空)
{
int i=0;
字符c,cmp[10],组织[10]=“0123456789”;
printf(“\n输入您的帐户密码\n键入0123456789\n”);
对于(i=0;(c=getchar())!=EOF;i++)
cmp[i]=c;
如果(!str_cmp(组织,cmp))
{
printf(“\n登录成功”);
}
其他的
printf(“\n密码不正确”);
返回0;
}
char str_cmp(char*porg,char*pcmp)
{
int i=0,l=0;
对于(i=0;*porg+i;i++)
{
如果(!(*porg+i==*pcmp+i))
{
l++;
}        
}
返回l;
}

尝试包含字符串。h:

#include <string.h>
这将取消对指针的引用,然后向其添加
i
。我很惊讶这条环线居然存在

如果您将其更改为此,它应该可以工作:

for(i=0;porg[i];i++) 
原始字符串也比您认为的长一个。您分配10个字节,但实际上它有11个字节长。字符串(引号中)始终以空字符结尾。您需要为char数组声明11个字节

另一个问题:

if(!(*porg+i==*pcmp+i))
应改为

if(!(porg[i]==pcmp[i]))

出于上面列出的相同原因。

尝试包括string.h:

#include <string.h>
这将取消对指针的引用,然后向其添加
i
。我很惊讶这条环线居然存在

如果您将其更改为此,它应该可以工作:

for(i=0;porg[i];i++) 
原始字符串也比您认为的长一个。您分配10个字节,但实际上它有11个字节长。字符串(引号中)始终以空字符结尾。您需要为char数组声明11个字节

另一个问题:

if(!(*porg+i==*pcmp+i))
应改为

if(!(porg[i]==pcmp[i]))

出于上述相同的原因。

有一些图书馆可以更简单地完成这项工作,但我认为这是一项作业,无论哪种方式,这都是一次很好的学习体验。我认为问题在于str_cmp函数中的for循环。您使用的条件是“*porg+i”。这并不是真正的比较。编译器将要做的是直到表达式等于0。一旦i太大,以至于*porg+i大于“int”可以存储的值,并且它被重置为0(这称为溢出变量),就会发生这种情况

相反,应该向str_cmp函数传递与字符串长度对应的大小。在for循环条件下,您应该确保i 但是,有一个内置的strncmp函数()可以完成这项工作

你也有不同的问题。您正在这样做指针添加:

*porg+i
这将获取数组第一个元素的值,并将i添加到其中。相反,您希望执行以下操作:

*(porg+i)
这将添加到指针,然后取消引用以获取值


通过比较更充分地阐明,因为这是指针的一个非常重要的概念。porg被定义为char*。这意味着您有一个内存地址为“char”的变量。在变量上使用解引用运算符(*,例如
*porg
)时,它返回存储在该内存段中的at值。但是,您可以向内存位置添加一个数字以移动到其他内存位置<代码>porg+1将在porg之后返回内存位置。因此,当您执行
*porg+1
操作时,您将获得内存地址处的值并将其加1。另一方面,当您执行
*(porg+1)
时,您将在porg指向的内存地址后一个位置获得值。这对数组很有用,因为数组会一个接一个地存储它们的值。但是,更容易理解的表示法是:
porg[1]
。这表示“在数组开始后获取值1”或换句话说“获取数组的第二个元素”

C中的所有条件都在检查值是零还是非零。零表示假,其他值表示真。当您将此表达式(
*porg+1
)用于条件时,它将进行计算(porg+1处的值),并检查它是否为零


这让我想到了C语言编程的另一个非常重要的概念。int只能保存一定大小的值。如果将变量添加到大于最大值的足够位置,它将循环到0。因此,让我们假设int的最大值是256(实际上要大得多)。如果一个int的值为256,加上1,它将变为零,而不是257。事实上,对于大多数编译器来说,最大数量是65536,这就是为什么需要这么长时间。它会一直等到*porg+i大于65536,这样它就会再次变为零。

有一些库可以更简单地实现这一点,但我认为这是一项作业,无论哪种方式,这都是一次很好的学习体验。我认为问题在于str_cmp函数中的for循环。您使用的条件是“*porg+i”。这并不是真正的比较。编译器将要做的是直到表达式等于0。一旦i太大,以至于*porg+i大于“int”可以存储的值,并且它被重置为0(这称为溢出变量),就会发生这种情况

相反,应该向str_cmp函数传递与字符串长度对应的大小。在for循环条件下,您应该确保i 但是,有一个内置的strncmp函数()可以完成这项工作

你也有不同的问题。您正在这样做指针添加:

*porg+i
这将获取数组第一个元素的值,并将i添加到其中。相反,你想把它弄坏