0

我希望用户输入一个 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;
     }
    }
   }
  }
 }
}
4

6 回答 6

4

共3道题:

问题1:

arr是一个悬空指针,你在scanf.

你需要:

int arr[4]; 

代替

int *arr;

问题2:

涉及j和的比较k被错误地括号化:

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

应该

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

问题3:

即使有上述 2 个修复程序,您的程序也会陷入无限循环,因为您的for循环没有终止条件。

由于您要求用户输入 4 位数字,因此您的所有循环都应该从0直到9

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

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

于 2010-10-12T04:36:11.073 回答
3

我还想对他们实施它的方式发表一些评论,这是一个好的做法吗?

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

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

于 2010-10-12T04:37:37.060 回答
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)
    
于 2010-10-12T04:34:43.837 回答
2

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

于 2010-10-12T04:36:14.817 回答
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 ?

于 2010-10-12T04:42:17.877 回答
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))
..
于 2010-10-12T04:34:09.847 回答