0

ユーザーに 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;
     }
    }
   }
  }
 }
}
4

6 に答える 6

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つのループにも同様のチェックを追加します。

于 2010-10-12T04:36:11.073 に答える
3

また、私がそれを実装している方法についていくつかコメントしたいのですが、それは良い習慣ですか?

質問のこの特定の部分に関して、実装しようとしているアルゴリズムについて少し考えてみてください。に保存されている番号を利用できますarr。ユーザーが番号を選択した場合、9999あなたはそれに到達する前に10000の番号を繰り返します。逆に、各桁を一度に1つずつ繰り返し、正しい桁が見つかったら停止すると(事前にわかっているため)、40回繰り返します。

数学的複雑さの観点から、現在のアルゴリズムのパフォーマンスは最悪の場合10 nですが、10nとして実装できます。

于 2010-10-12T04:37:37.060 に答える
2

いくつかの問題があります。

  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)
    
于 2010-10-12T04:34:43.837 に答える
2

かっこが間違っています。*(arr+1==j)、などである必要があります*(arr+1)==j。これでコンパイラの警告は修正されますが、arr[1]==j(など)はさらに優れています。

于 2010-10-12T04:36:14.817 に答える
1

Consider your innermost loop

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

If the number entered by the user is anything that is not staring with 000 - how will this loop ever get terminated? Will this not just go on looping infinitely for i, j, k ==0 ?

于 2010-10-12T04:42:17.877 に答える
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))
..
于 2010-10-12T04:34:09.847 に答える