我的问题为什么我的程序需要很长时间才能执行,这个程序应该检查用户密码,使用的方法是 将密码表格控制台输入到数组和 将它与之前保存的密码进行比较 比较由函数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;
}
答案 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]))
出于上述原因。