Как работает scanf () внутри printf ()? - PullRequest
0 голосов
/ 12 июня 2018
#include<stdio.h>
int main(){

        int n;
        printf("%d\n",scanf("%d",&n));
        return 0;
}

Интересно, почему вывод этой программы всегда равен '1' ?!Что на самом деле здесь происходит?

Ответы [ 10 ]

0 голосов
/ 30 июня 2018

scanf() - это функция, которая является целочисленной функцией возвращаемого типа.Возвращает общее количество конверсионных символов в нем.Например, если утверждение записывается как:

int c;
c=scanf("%d %d %d");
printf("%d",c);

, то результат этой программы будет 3.Это связано с тем, что scanf() является целочисленной функцией возвращаемого типа и возвращает общее количество символов преобразования, поэтому, будучи 3 символами преобразования, она возвращает 3 в c.Таким образом, в вашем коде scanf() возвращает 1 в printf() и, следовательно, вывод программы равен 1.Это связано с тем, что если в printf() используется более одного оператора, выполнение начинается справа налево.Таким образом, сначала выполняется scanf(), а затем printf().

0 голосов
/ 12 июня 2018

scanf возвращает количество успешных преобразований и назначений.В вашем случае вы сканируете только один аргумент, поэтому scanf либо вернет 1 в случае успеха, 0 в случае совпадения при сбое (где вводится первый непробельный символ)не является десятичной цифрой) или EOF в конце файла или в ошибке.

Когда вы вызываете printf, каждый из его аргументов оценивается , и результат передается функции.В этом случае оценка включает вызов функции scanf.Значение, возвращаемое scanf, затем передается в printf.

По сути, это то же самое, что и запись

int count = scanf( "%d", &n );
printf( "%d\n", count );

Что касается хихиканья, посмотрите, что произойдет, когда вы введете abc или наберете Ctrl D (или Ctrl Z в Windows).

Обратите внимание, что printf также возвращает значение (количество байтов, записанных в поток)Таким образом, вы можете написать что-то смешное 1 , как

printf( "num bytes printed = %d\n", printf( "num items read = %d\n", scanf( "%d", &n ) ) );


Шутка.Не делай этого.
0 голосов
/ 12 июня 2018

Если вы используете этот код в качестве примера, он показывает: предупреждение: неявное объявление функции 'printf' [-явное объявление-функции]

int main()
{
char b[40]; 
printf(" %d", scanf("%s", b));
getchar();
} 

Возвращаемое значение: -1

Выходы таких функций, как printf и scanf могут использоваться в качестве параметра для другой функции.

0 голосов
/ 12 июня 2018

scanf возвращает количество успешных конверсий.Попробуйте изменить scanf, как показано ниже .... вы заметите печать 2 после ввода двух допустимых целых чисел.

int n1 =0;
int n2 =0;
int i = scanf("%d %d",&n1,&n2);
0 голосов
/ 12 июня 2018

@ jishnu , хороший вопрос, и вывод, который вы получаете, также верен, поскольку вы читаете только одно значение из стандартного ввода (stdin).

scanf() читает значения, введенные из стандартного ввода, и возвращает количество значений, успешно считанных со стандартного ввода (клавиатура).

В C printf() возвращает количество символов, успешно записанных на выходе, и scanf()возвращает количество успешно прочитанных элементов.Посетите https://www.geeksforgeeks.org/g-fact-10/ и узнайте больше об этом.

Посмотрите на следующие 2 примера кода.

Попробуйте приведенный ниже код онлайн на http://rextester.com/HNJE76121. // clang 3.8.0

#include<stdio.h>
int main(){

    int n, n2;
    printf("%d\n",scanf("%d%d",&n, &n2));   //2
    return 0;
}

В вашем коде scanf() читает только 1 значение из клавиатуры (stdin), поэтому вывод равен 1.

//clang 3.8.0

#include<stdio.h>
int main(){

    int n;
    printf("%d\n",scanf("%d",&n));   //1
    return 0;
}
0 голосов
/ 12 июня 2018

Я подозреваю, что вы хотели использовать

int n;
scanf("%d", &n);
printf("%d\n", n);

, но то, что вы написали, эквивалентно

int n;
int num = scanf("%d", &n); // num is the number of successful reads.
printf("%d\n", num);
0 голосов
/ 12 июня 2018

Программа примерно в точности эквивалентна

#include <stdio.h>

int main() {
    int n;
    int r = scanf("%d", &n);
    printf("%d\n", r);
    return 0;
}

Так что если вы запустите эту программу, и если вы наберете (скажем) 45, то scanf прочитает 45 и присвоит его n и верните 1, чтобы сказать, что это так.Программа печатает значение 1, возвращаемое scanf (то есть не число чтение при scanf!).

Попробуйте запустить программу и набрать "А "вместо этого.В этом случае scanf должно вернуться, и ваша программа должна вывести 0. 0. 1015 *

Наконец, если вы можете, попробуйте запустить программу и вообще не вводить ее.Если вы работаете в Unix, Mac или Linux, попробуйте набрать control-D сразу после запуска вашей программы (то есть без ввода чего-либо еще) или запустите ее с перенаправленным вводом:

myprog < /dev/null

OnВ Windows вы можете набрать control-Z (возможно, за которым следует ключ Return), чтобы сгенерировать условия конца файла.В любом из этих случаев должно возвращаться scanf, и ваша программа должна печатать -1.

0 голосов
/ 12 июня 2018

In man scanf,

Возвращаемое значение

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

В вашей программе он просто соответствует 1 вводу, поэтому функция scanf вернет 1, если вы введете допустимое значение, которое может соответствовать %d, иначе вернет 0.

В вашей ситуации вы всегда можете удовлетворить эти требования, поэтому всегда верните 1.

0 голосов
/ 12 июня 2018

В вашей программе scanf возвращает 1, если какое-то значение scanf успешно заносится в n, и поэтому вы всегда получаете 1 от вашего printf("%d\n",scanf("%d",&n));.Вы должны изменить свой код следующим образом

#include<stdio.h>
int main(){

        int n;
        scanf("%d",&n);
        printf("%d\n",n);
        return 0;
}
0 голосов
/ 12 июня 2018

Документация scanf () гласит, что возвращаемое значение:

Number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.

Код, который вы хотите вместо этого:

#include<stdio.h>
int main(){

    int n;
    scanf("%d",&n);
    printf("%d\n",scanf("%d",&n));
    return 0;
}
...