0

我的问题为什么我的程序需要很长时间才能执行,该程序应该检查用户密码,使用的方法是将密码表单控制台放入数组并将其与以前保存的密码比较是由函数 str_cmp()-returns 完成的如果字符串相等则为零,如果不相等则非零

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

2 回答 2

3

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

相反,您应该将与字符串长度相对应的大小传递给 str_cmp 函数。在 for 循环条件中,您应该确保 i < 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 的 int 并将其加 1,它将变为 0 而不是 257。实际上,对于大多数编译器来说,最大数字是 65,536,所以这就是它需要这么长时间的原因。它一直等到 *porg + i 大于 65,536 以使其再次变为零。

于 2012-04-11T05:04:46.527 回答
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]))

出于上述相同的原因。

于 2012-04-11T05:01:00.337 回答