Почему% scan необходим в scanf? - PullRequest
5 голосов
/ 15 июля 2010

Я создал очень простую программу с меню, что принять значение, а затем запомнить его в значение локальной переменной, и, наконец, с Второй вариант - программа печатает значение.

мой вопрос: Почему программа работает, только если я добавляю "ч" к параметру scanf? Другими словами: какие существуют отношения между scanf () и моей локальной переменной типа int?

спасибо!

p.S. (Я использовал Dev-C ++ (GCC) для его компиляции. С Visual Studio это работает)

#include <stdio.h>

main () {

    int value = 0;
    short choice = 0;

    do {
       printf("\nYour Choice ---> ");
       scanf("%d", &choice);  /* replace with "%hd" and it works */

       switch (choice) {
          case 1:
               printf("\nEnter a volue to store ");
               scanf("%d", &value);
               getchar();              
               printf("\nValue: %d", value);
               break;
          case 2:
               printf("\nValue: %d", value);            
               break;  
       }

    } while (choice < 3);

    getchar();
}

Ответы [ 9 ]

11 голосов
/ 15 июля 2010

С scanf модификатор "h" указывает, что он читает короткое целое число, какова ваша переменная choice. Таким образом, «% hd» необходимо записать только два байта (на большинстве машин) вместо 4 байтов, которые записывает «% d».

Для получения дополнительной информации см. Эту справочную страницу на scanf

2 голосов
/ 15 июля 2010

Переменная choice имеет тип short, поэтому для ее чтения вам необходим спецификатор %h в scanf (на самом деле вам не нужен d здесь). Тип int просто требует %d. Смотрите примечания по конверсиям здесь

1 голос
/ 15 июля 2010

choice - это short, а% d указывает int.

Когда вы указываете% d, scanf должен предполагать, что связанный аргумент является указателем на блок памяти размером int, и записывает в него int.Когда это произойдет, он, скорее всего, будет записывать данные, смежные с choice, но не являющиеся его частью, а результаты не определены и, вероятно, не будут хорошими!Если он работает в одном компиляторе, а не в другом, это просто характер поведения undefined !

В GCC -Wformat должен выдавать предупреждение при возникновении этой ошибки.

1 голос
/ 15 июля 2010

Похоже, ваша проблема в том, что choice - это short, длина которого (как правило) 2 байта, тогда как %d ожидает целое число, которое (обычно) равно 4 байта ... Итак, scanfClobbers все, что идет после choice в стеке.

1 голос
/ 15 июля 2010

Вы читаете в коротком.H необходим, потому что% d по умолчанию является размером с int.См. Эту справочную страницу на scanf .

0 голосов
/ 15 июля 2010

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

0 голосов
/ 15 июля 2010

Модификатор для scanf для ввода переменной типа short -% hd.Следовательно, вам нужно указать правильный модификатор.

scanf("%d",&integer);  // For integer type
scanf("%hd",&short_int); // For short type

Следовательно, он не работает.

0 голосов
/ 15 июля 2010

%d для чтения int, а не короткого. Ваш код никогда не «работал» - просто кажется, что в этом случае вы не заметили никакой разницы между тем, что вы хотели, и неопределенным поведением, которое вы получили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...