题
我希望用户输入一个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:
涉及的比较 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个循环。
其他提示
我还想对他们实施的方式发表一些评论,这是一个好习惯吗?
关于您问题的这一特定部分,请考虑您要暂时实现的算法。您有可用的数字,存储在 arr
. 。如果用户选择数字 9999
到达之前,您将迭代10000个数字。相反,如果您一次遍历每个数字,并在找到正确的数字时停止(既然它已知),则您会迭代40次。
就数学复杂性而言,您当前的算法的最差性能为10n, ,而它可以用作10N。
我看到了几个问题:
您不是分配任何记忆
*arr
. 。也许你应该定义arr
作为int arr[4];
然后,在SCANF中,您可以做类似的事情:
scanf("%d", &arr[i]);
您可以在问题行上使用数组偏移符号:
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))
..