Я не знаю, почему, когда я использую функцию scanf в C, чтобы получить число и распечатать его, оно почти всегда равно 1

#c

Вопрос:

Я использую gcc в arch linux, компьютер-старый dell inspiron. На языке си я мог бы написать:

     #include <stdio.h>
    int main
    {
    int x = scanf("%i",amp;x);
    printf("%i",x);
    }
 

я могу скомпилировать этот файл, и он пройдет, и он даст мне 1.000000 за бодание в любом количестве.

 #include <stdio.h>
int main()
{
double x;
x = scanf("%lf",amp;x);
printf("%lf",x);
}
 

я мог бы указать переменную перед сканированием, если я могу использовать %d.
я огляделся вокруг и на самом деле ничего не нашел.
если у вас есть еще какие-либо вопросы, пожалуйста, задавайте.
Спасибо.

редактировать я не хотел, чтобы amp; с добавлением printf x int amp; edit для информации

Комментарии:

1. Вы выводите возвращаемое значение scanf — не аргумент.

2. scanf требуется указатель на переменную, в которой должно храниться входное значение, но printf должно быть передано само значение. Поэтому последняя строка должна быть printf("%i", x); без amp; . За это вы должны были получить предупреждение компилятора.

3. я допустил ошибку, я не хотел ставить amp; вместе с printf. Спасибо

4. Напомним, что вы не можете правильно использовать какую-либо функцию ввода, если не проверите возврат , чтобы определить, был ли ввод успешным или неудачным. Неспособность проверить входные данные приводит к неопределенному поведению в вашем коде. (конечно, если вы сохраняете возврат, вы используете отдельную переменную, например int rtn = scanf("%i",amp;x); if (rtn == EOF) { /* handle EOF case */ } else if (rtn == 0) { /* handle matching failure */ } else if (rtn == 2) { /* good input */ }

Ответ №1:

Вы допустили 3 ошибки в 2 строках. Вам следует ознакомиться с документацией об используемых функциях.

  1. scanf возвращает количество успешно отсканированных элементов, а не отсканированное значение. Если вы сканируете 1 объект, то в случае scanf успешного выполнения возвращаемое значение всегда будет 1
  2. printf("%i", amp;x); не выводит значение x , только адрес (ссылку) x использования неправильного спецификатора формата, который является UB.

Комментарии:

1. Я обычно всегда предупреждаю о последствиях отказа в проверке входных данных (так же, как вы объясняете последствия в своем № 2.). Хорошо сделано.

Ответ №2:

Это должно быть:

 #include <stdio.h>

int main(void) {
    int x;
    scanf("%i", amp;x);
    printf("%i", x);

    return 0;
}
 

Комментарии:

1. лучше if(scanf("%i", amp;x) == 1) printf("%i", x);