C 预测数字
我希望用户输入一个4位数字,程序必须告诉这个4位数字是什么,即通过暴力攻击生成这个4位数字。但是在下面提到的行中,编译器说间接无效。我还想对我实现它的方式提出一些意见,这是一个好的做法吗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(
#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倍。我想知道二进制搜索算法怎么能像它首先按顺序对数字进行排序。