预测数字

时间:2010-10-12 04:30:11

标签: c arrays pointers loops brute-force

我希望用户输入一个4位数字,程序必须告诉那个4位数字是什么,即通过暴力攻击产生4位数字。但是在下面提到的那一行,编译器说无效间接。我也会喜欢对我实施它的方式有一些评论,这是一个好习惯吗?

#include<stdio.h>
void BruteForceAttack(int *arr);
int main()
{
 int *arr,i;
 printf("Enter 4 digits ,press enter after entring each digit:\n");
 for(i=0;i<4;i++)
 scanf("%d",arr+i);
 BruteForceAttack(arr);
 getchar();
 return 0;
}
void BruteForceAttack(int *arr)
{
 int i,j,k,l;
 for(i=0;;i++)
 {
  for(j=0;;j++)
  {
   for(k=0;;k++)
   {
    for(l=0;;l++)
    {
      if((*(arr+0)==i)&&(*(arr+1==j))&&(*(arr+2==k))&&(*(arr+3)==l))   /*Here the compiler says invalid indirection*/
     {
      printf("The number is %d%d%d%d",i,j,k,l);
      return;
     }
    }
   }
  }
 }
}

6 个答案:

答案 0 :(得分:4)

总共3个问题:

问题1:

您的arr是一个悬空指针,您在scanf中取消引用它。

你需要:

int arr[4]; 

取代

int *arr;

问题2:

涉及jk的比较被错误地分配了对象:

&&(*(arr+1==j))&&(*(arr+2==k))

应该是

&&(*(arr+1)==j)&&(*(arr+2)==k)
          ^              ^

问题3:

即使有上述2项修正,您的程序也会遇到无限循环,因为您的for循环没有终止条件。

由于您要求用户输入4位数字,因此您的所有循环应该从09为:

for(i=0;i<10;i++)
        ^^^^^

为其他3个循环添加类似的检查。

答案 1 :(得分:3)

  

我还想要一些   评论他们的方式我   实施它,这是一个好习惯吗?

关于您问题的这一特定部分,请考虑您尝试实施的算法。您有可用的号码,存储在arr中。如果用户选择号码9999,您将在到达之前迭代10000个号码。相反,如果您一次迭代一个数字并在找到正确的数字时停止(因为事先已知),您将迭代40次。

就数学复杂性而言,您当前的算法具有10 n 的最差情况,而它可以实现为10n。

答案 2 :(得分:2)

我看到了几个问题:

  1. 您没有为*arr分配任何内存。也许您应该将arr定义为

    int arr[4];
    

    然后,在scanf中,您可以执行以下操作:

    scanf("%d", &arr[i]);
    
  2. 您可以在问题行中使用数组偏移表示法:

    if(arr[0] == i && arr[1] == j && arr[2] == k && arr[3] == l)
    

答案 3 :(得分:2)

你的括号放错了地方。 *(arr+1==j)应为*(arr+1)==j等。这将修复编译器警告,但arr[1]==j(等)会更好。

答案 4 :(得分:1)

考虑你最内层的循环

for(l=0;;l++)
    {
      if((*(arr+0)==i)&&(*(arr+1==j))&&(*(arr+2==k))&&(*(arr+3)==l))   /*Here the compiler says invalid indirection*/
     {
      printf("The number is %d%d%d%d",i,j,k,l);
      return;
     }
    }

如果用户输入的数字是任何不盯着000的数字 - 这个循环将如何终止?这不仅仅是为i,j,k == 0?

无限循环

答案 5 :(得分:0)

你没有为arr分配任何空间!使用malloc分配空间。

...
int *arr,i;
arr = (int *) malloc(4*sizeof(int));
...

此外,您正在将布尔值(c中的int)转换为地址!错误行中的大括号是错误的。

...
if((*(arr+0)==i)&&((*(arr+1)==j))&&((*(arr+2)==k))&&((*(arr+3)==l))
..