我希望用户输入一个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;
}
}
}
}
}
}
答案 0 :(得分: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个循环添加类似的检查。
答案 1 :(得分:3)
我还想要一些 评论他们的方式我 实施它,这是一个好习惯吗?
关于您问题的这一特定部分,请考虑您尝试实施的算法。您有可用的号码,存储在arr
中。如果用户选择号码9999
,您将在到达之前迭代10000个号码。相反,如果您一次迭代一个数字并在找到正确的数字时停止(因为事先已知),您将迭代40次。
就数学复杂性而言,您当前的算法具有10 n 的最差情况,而它可以实现为10n。
答案 2 :(得分:2)
我看到了几个问题:
您没有为*arr
分配任何内存。也许您应该将arr
定义为
int arr[4];
然后,在scanf中,您可以执行以下操作:
scanf("%d", &arr[i]);
您可以在问题行中使用数组偏移表示法:
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))
..