Вопрос

Я хочу, чтобы пользователь вводил 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;
     }
    }
   }
  }
 }
}
Это было полезно?

Решение

Всего 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:

Даже с вышеупомянутыми исправлениями ваша программа столкнется с бесконечный цикл, потому что ты for петли имеют нет прекращения условия.

Поскольку вы просите пользователя ввести 4 цифры, весь ваш цикл должен переходить от 0 пока 9 в виде:

for(i=0;i<10;i++)
        ^^^^^

Добавьте аналогичную проверку для других 3 петлей.

Другие советы

Я также хотел бы иметь несколько комментариев о том, как я их реализую, это хорошая практика?

Что касается этой конкретной части вашего вопроса, рассмотрите алгоритм, который вы пытаетесь реализовать на мгновение. У вас есть цифры, которые вам доступны, хранятся в arr. Анкет Если пользователь выбирает номер 9999 Вы будете переходить через 10000 номеров, прежде чем добраться до него. И наоборот, если вы выполняете выполнение каждой цифры по одной и останавливаетесь, когда вы найдете правильную цифру (так как она известна заранее), вы итерации 40 раз.

С точки зрения математической сложности, ваш текущий алгоритм имеет худшую производительность 10N., тогда как это может быть реализовано как 10n.

Я вижу пару проблем:

  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)
    

Ваши скобки неуместны. *(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));
...

Кроме того, вы преобразуете логический (int in c) в адрес! Брекеты неверны в линии ошибок.

...
if((*(arr+0)==i)&&((*(arr+1)==j))&&((*(arr+2)==k))&&((*(arr+3)==l))
..
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top