Scanf и адресный оператор (&) не работают внутри цикла - PullRequest
0 голосов
/ 30 октября 2018

У меня есть назначение, и мне было интересно, почему, когда я компилирую этот код и запускаю его, scanf("%d", &temp_pin) не сохраняет данные в адресе. Я знаю это, потому что в следующем утверждении printf("%d", temp_pin) мне просто даны случайные величины. У меня есть другой оператор scanf в предыдущих строках кода, который работает, и я просто озадачен, почему этот не работает. Большое спасибо!

#include <stdio.h>

int main()
{
//Deceleration of Variables
int option;
int pin [4]={1, 2, 3, 4};
int temp_pin [4];
int new_pin [4];
int temp_new_pin [4];
int correct;
int incorrect;



do
{
    printf("Please enter which option you wish to operate\n\n");
    printf("1. Enter your pin\n");
    printf("2. Change your pin\n");
    printf("3. Display the number of times the PIN was entered: \n  Successfully\n  Unsuccessfully\n");
    printf("4. Exit Program\n\n");

    scanf("%d", &option);

    if (option == 1)
    {
    printf("\nPlease Enter Your PIN\n");

    for (int i = 0; i < 4; i++)
    {
        scanf(" %d", &temp_pin);
        printf(" %d", temp_pin);

        if (temp_pin==pin)
        {
            printf("\nYour PIN is correct\n");
        }

        if (temp_pin != pin)
        {
            printf("\nYour PIN is incorrect\n");
        }
     }//End For
     }//End If

} // end do
while(option != 4);

return 0;
}

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы пытаетесь прочитать массив одним вызовом scanf, но в c он работает так же. Обратите внимание, что temp_pin уже является адресом первого элемента в массиве. Линия

scanf("%d", temp_pin);

эквивалентно строке

scanf("%d", &(temp_pin[0]));

, и он читает значение и сохраняет его в temp_pin[0].

Чтобы прочитать весь массив, вам нужно сделать что-то вроде этого:

for (int i=0; i<4; i++) scanf("%d", &(temp_pin[i]));

Та же история со сравнением. Вы не можете сравнить два массива с одной == операцией. Выражение temp_pin == pin сравнивает адреса, которые всегда будут разными, несмотря на фактические значения, хранящиеся в этих массивах. Чтобы сравнить два массива, вам нужно сделать что-то вроде этого:

int isEqual = 1; // a flag for whether arrays are equal 
for (int i=0; i<4; i++) {
    if (temp_pin[i] != pin[i]) {
        isEqual = 0; 
    }
}
if (isEqual) printf("pins are the same\n");
else printf("pins are not the same\n");
0 голосов
/ 31 октября 2018

Если бы я мог сделать одно предложение, он бы изменил все целочисленные массивы на целые. Это решит все ваши проблемы. Однако, если ваше назначение требует использования целочисленных массивов, следуйте приведенному ниже коду.

В настоящее время вы устанавливаете только первый элемент temp_pin, равный пользовательскому вводу. Строка scanf(" %d", &temp_pin); фактически сохраняет целое число в temp_pin[0].

Поскольку размер вывода равен 4, вам нужно прочитать 4 отдельных целых числа для хранения в массиве. Я бы предложил использовать цикл for, который может устанавливать значения temp_pin[0], temp_pin[1], temp_pin[2], temp_pin[3]

Логически, я бы также предложил проверять ошибки каждого целого числа, поскольку целое число может быть от -32 768 до 32 767. В настоящее время целочисленный массив с элементами 3300,55,12,15 будет правильным пином.

Значение, которое вы задаете в этой строке printf(" %d", temp_pin);, не является случайной величиной. Это адрес временного штифта. Чтобы напечатать значения, хранящиеся в temp_pin, вам нужно будет пройтись по каждому элементу в массиве и распечатать его по отдельности.

Для вашего оператора сравнения if (temp_pin==pin) это никогда не приведет к истине, так как сравнивает адреса. Опять же, правильным решением для этого было бы выполнить итерацию по обоим спискам одновременно и сравнить каждый элемент.

0 голосов
/ 30 октября 2018

У вас есть temp_pin, объявленный как массив целых чисел, поэтому &temp_pin является указателем на массив и имеет тип int (*)[4]. Спецификатор формата %d ожидает int *.

Аналогично, при печати вы передаете массив temp_pin, который распадается на указатель на первый элемент, и этот адрес - то, что печатается.

Измените тип temp_pin и другие переменные, объявленные как массивы, на int и удалите цикл.

int pin = 1234;
int temp_pin;
int new_pin;
int temp_new_pin;

...

if (option == 1)
{
    printf("\nPlease Enter Your PIN\n");

    scanf(" %d", &temp_pin);
    printf(" %d", temp_pin);

    if (temp_pin==pin)
    {
        printf("\nYour PIN is correct\n");
    }
    else
    {
        printf("\nYour PIN is incorrect\n");
    }
}//End If
...