C 预测数字

C 预测数字,c,arrays,pointers,loops,brute-force,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(

我希望用户输入一个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;
     }
    }
   }
  }
 }
}
#包括
无效暴力攻击(int*arr);
int main()
{
int*arr,i;
printf(“输入4位数字,在输入每个数字后按Enter键:\n”);

对于(i=0;i您没有为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))
..

我看到了几个问题:

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

    int arr[4];
    
    然后,在scanf中,您可以执行以下操作:

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

    if(arr[0] == i && arr[1] == j && arr[2] == k && arr[3] == l)
    
  • 共有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++)
            ^^^^^
    

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

    我也想要一些 对他们的评论就像我一样 实施它,这是一种好的做法吗

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

    关于这个问题的特定部分,考虑一下你正在尝试执行的算法。你有可用的数字,存储在<代码> ARR < /代码>中。如果用户选择了数字<代码> 9999代码/代码>,在你到达它之前,你将迭代10000个数字。反之,如果你遍历每个数字。每次,当您找到正确的数字(因为它是事先知道的)并停止时,您将迭代40次


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

    考虑一下最内部的循环

    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+b)
    相当于
    arr[b]
    @Christian:同意!但是,由于我有Lisp的背景,我觉得必须修正括号…如何结交朋友和影响他人:因为
    arr[b]
    相当于
    *(arr+b)
    ,它也相当于
    *(b+arr)
    ,相当于
    b[arr]
    。因此您可以将数组表示法写成
    1[array]
    ,其工作原理与
    array[1]相同
    。实际上,我想用蛮力之类的东西来找出数字,就像我们破解密码一样passwords@fahad:如果它是纯数字密码,则您可以通过首先将密码转换为整数来实现更快的算法,然后。除非您想要实现字典攻击或类似的攻击(但我想这并不是真正的“暴力”。不过,你可以相当容易地在数字密码上实现一个密码。我可能应该补充一点,二进制搜索也假定你有办法知道你是“大于”还是“小于”密码。如果你严格地通过暴力猜测(只有是/否回答)那么你的算法就是你必须要做的。因此,为什么暴力强制输入密码需要花费大量的时间,为什么更长的密码更安全。即使有一个数字,每多出一个数字,最差的时间性能也会增加10倍。我想知道二进制搜索算法怎么能像它首先按顺序对数字进行排序。