2015-06-10 5 views

ответ

1

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

Вы не указали, что ожидали, поэтому я не знаю, что исправить.

2

Когда используется тип sepcifier %d, тогда функция ожидает, что будет введено допустимое целое число с десятичной запятой. Очевидно, что символ 'A' не является числом, поэтому вход не удался.

Теперь возникает вопрос: какова будет функция в этом случае?

Согласно описанию функции scanf (С Standard, 7.21.6.4 Функции Scanf):

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

Так условие в, если заявление

if(scanf("%d",&a)) 

оценивали на 0 (ложь) и утверждение еще было выполнено.

else 
printf("%d",a-1); 

что outputed 4.

Примите во внимание, что в общем случае вы можете ввести символ 'A' для целых чисел. Но в этом случае соответствующее число переменная должна быть объявлена ​​как unsigned и спецификатора формата из scanf должен, чтобы быть %x

Например

#include <stdio.h> 

int main(void) 
{ 
    unsigned int a = 5; 

    if (scanf("%x", &a)) 
    {  
     printf("%u\n", a + 1); 
    } 
    else 
    { 
     printf("%u\n", a - 1); 
    } 
} 

В этом случае на выходе будет 11. :) scanf будет рассматривать символ 'A' как шестнадцатеричное представление 10.

0

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

для больше зазора: - Нажмите here!