字符串比较执行缓慢

时间:2012-04-11 04:55:16

标签: pointers strcmp

我的问题为什么我的程序需要很长时间才能执行,这个程序应该检查用户密码,使用的方法是 将密码表格控制台输入到数组和 将它与之前保存的密码进行比较 比较由函数str_cmp()完成 - 如果字符串相等则返回0,如果不相等则返回非零

  #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;
  }

2 个答案:

答案 0 :(得分:3)

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

相反,您应该将一个大小传递给str_cmp函数,该函数对应于字符串的长度。在for循环条件中,你应该确保i&lt; str_size。

然而,strncmp函数(http://www.elook.org/programming/c/strncmp.html)中有一个构建这样做的东西。

您还有其他问题。你正在做像这样的指针添加:

*porg+i

这将获取数组的第一个元素的值并将i添加到它。相反,你想做:

*(porg+i)

这将添加到指针然后取消引用它以获取值。


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

C中的所有条件都在检查值是零还是非零。零表示错误,其他每个值都表示正确。当你对一个条件使用这个表达式(*porg + 1)时,它将进行计算(porg + 1处的值)并检查它是否为零。

这引出了我用C编程的另一个非常重要的概念.int只能保存一定大小的值。如果变量被添加到足够大于最大值的位置,它将循环到0。所以假设int的最大值是256(实际上它要大得多)。如果你有一个值为256并且加1的int,它将变为零而不是257.实际上大多数编译器的最大数量是65,536,所以这就是为什么它需要这么长时间。它等待* porg + i大于65,536,以便它再次变为零。

答案 1 :(得分:1)

尝试包含string.h:

#include <string.h>

然后使用内置的strcmp()函数。在大多数情况下,现有的字符串函数已经被编写为尽可能快。

另外,我认为你的for陈述搞砸了:

for(i=0;*porg+i;i++) 

这将取消引用指针,然后向其添加i。我很惊讶for循环退出。

如果你把它改成这个,它应该有效:

for(i=0;porg[i];i++) 

您原来的字符串也比您想象的要长。你分配10个字节,但它实际上是11个字节长。字符串(引号)始终以空字符结束。您需要为char数组声明11个字节。

另一个问题:

if(!(*porg+i==*pcmp+i))

应改为

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

出于上述原因。