Как получить int с scanf () - PullRequest
0 голосов
/ 27 февраля 2019
void pedir_diag(int* diag){
  scanf("%i", &diag);
}

int main() {
  int number;

  pedir_diag(&number);

  return 0;
}

Когда я компилирую, введите целое число и ожидаю, что переменная number int в main имеет введенное значение, но не установлена ​​

У меня есть это, в моем коде, но я не могу установить diagпеременная с функцией scanf ().

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Лучший способ использовать scanf на протяжении всей жизни кода - запоминание следующего правила

scanf("%[direction_of_what_to_scan][special format character]",
    Pointer_on_some_memory_location);

Что делает scanf, так это то, что он хранит то, что было введено (с некоторыми ограничениями по длине)по адресу памяти.Итак, либо:

int n1;
scanf("%d",&n); //which means the address of variable n1 in memory

, либо

int *n2 = &n1;
scanf("%d",n) // &doesn't need to be used cause n2 is now already pointer to an integer

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

0 голосов
/ 27 февраля 2019

diag уже является указателем, поэтому нет необходимости в адресе оператора (&) при вызове scanf():

void pedir_diag(int *diag)
{
    scanf("%d", diag);
}

Но делать это таким образом довольно глупо,У вас нет возможности проверить наличие ошибочных данных.Лучше:

#include <stdbool.h>

bool pedir_diag(int *diag)
{
    return scanf("%d", diag) == 1;  // *)
}

*) scanf() возвращает количество успешных конверсий, поэтому, если количество успешных конверсий равно 1, мы возвращаем true.

Использование:

#include <stdio.h>

int main(void)
{
    int foo;

    if (!pedir_diag(&foo)) {
        fputs("Input error :(\n\n", stderr);
    }
    else {
        // have fun with foo
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...