Что происходит, когда спецификатор формата% d используется в scanf для чтения символа с клавиатуры? - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок в C языке программирования и пытаюсь изучить поведение некоторых простых фрагментов, таких как упомянутый ниже:

#include<stdio.h>
int main()
{
    int number;
    printf("Enter a number:");
    scanf("%d",&number);
    printf("The entered number is:%d",number);
    return 0;
}

Приведенный выше код прекрасно работает, когда scanf ( ) функция считывает десятичные числа с клавиатуры. Однако, когда я намеренно ввожу алфавиты, я получаю вывод как 0, а когда я ввожу любые другие символы, я получаю вывод как 53. Может кто-нибудь объяснить, почему это происходит?

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

% d для любого количества десятичных цифр (0-9). И для странного поведения вам нужно проверить возвращаемое значение функции scanf

Вот точный фрагмент документации из scanf

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

Если произойдет ошибка чтения или конец файла достигается при чтении, установлен правильный индикатор (feof или ferror). И, если что-либо произойдет до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

Если при интерпретации широких символов происходит ошибка кодирования, функция устанавливает errno на EILSEQ.

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

Вот фрагмент кода, который выполнит такую ​​проверку ошибок

#include<stdio.h>
int main()
{
    int number;
    int ret;
    printf("Enter a number:");
    ret = scanf("%d",&number);
    if(ret == 1){ // number of expected items to be filled; in your case 1
        printf("The entered number is:%d\n",number);         
    }else{
       printf("Invalid Input\n");
    }
    return 0;
}
0 голосов
/ 13 апреля 2020

" Что происходит, когда спецификатор формата %d используется в scanf() для чтения символа с клавиатуры? "

Фактический C стандарт (C18), Раздел 7.21.6.2/10 - «Функция fscanf» сообщает:

" Если входной элемент не совпадает с последовательностью, выполнение директивы завершается неудачей: это условие является ошибкой сопоставления."

Таким образом, выполнение директивы в предоставленном вами случае должно завершиться неудачей, так как вы ввели символ, и никакое значение не должно быть записано в number из этого конкретный scanf() звонок.

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


"Однако, когда я намеренно вводю алфавиты, я получаю вывод как 0, а когда я вводю любые другие символы, я получаю вывод как 53. Может кто-нибудь объяснить, почему это происходит?"

Причина, по которой он печатает произвольные числа, заключается в том, что вы не инициализировали number ни с каким значением:

int number;

Поскольку number является объектом класса хранения auto по умолчанию, оно содержит случайное значение мусора, которое затем печатается printf(). Он не имеет ничего общего с вызовом scanf() как есть.

Таким образом, если вы инициализируете number с допустимым значением в его определении, например, fe int number = 24; Я уверен, что вывод программа будет 24 при вводе символов.

0 голосов
/ 13 апреля 2020

Символ% d означает, что он ожидает десятичное число, обратите внимание, что это не число с плавающей запятой, а целое число. Если вы хотите поместить туда символы, используйте% c.

...