我希望用户输入一个4位数字,并且该程序必须告诉什么4位数字是IE生成的4位数字通过Brute攻击。但是在下面提到的编译器中,在编译器上说无效的间接。我也想拥有关于我实施的方式的一些评论,这是一个好习惯吗?

#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;
     }
    }
   }
  }
 }
}
有帮助吗?

解决方案

总共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位数字,因此您所有的循环都应该从 0 直到 9 作为:

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

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

其他提示

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

关于您问题的这一特定部分,请考虑您要暂时实现的算法。您有可用的数字,存储在 arr. 。如果用户选择数字 9999 到达之前,您将迭代10000个数字。相反,如果您一次遍历每个数字,并在找到正确的数字时停止(既然它已知),则您会迭代40次。

就数学复杂性而言,您当前的算法的最差性能为10n, ,而它可以用作10N。

我看到了几个问题:

  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)
    

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

考虑您的最内向循环

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进行无限循环吗?

您没有为ARR分配任何空间!使用malloc分配空间。

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

另外,您将布尔值(IN IN C)转换为地址!牙套在错误线中是错误的。

...
if((*(arr+0)==i)&&((*(arr+1)==j))&&((*(arr+2)==k))&&((*(arr+3)==l))
..
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top