dubeypankaj Ответов: 1

Разница между scanf ("%C", &opt) и scanf ("%C", & opt)


Я исполняю мой язык программы на языке C в интегрированной среде разработки TurboC3.
Нерабочий код выглядит следующим образом

#include<stdio.h>
#include<conio.h>
void main()
    {
    int i, j, t;
    char opt;
    clrscr();
    printf("Enter two values" );
    scanf("%d", &i);
    scanf("%d", &j);
    printf("\n\n press + for sum\n");
    printf("press * for mult\n");
    printf("print - for subtract\n\n");
    scanf("%c", &opt); // code that is creating problem //
    switch(opt)
        {
        case '+':
            {t=i+j;
            printf("\nsum =%d", t);
            }
            break;
        case '*':
            {t=i*j;
            printf("\nproduct =%d", t);
            }
            break;
        case '-':
            {t=i-j;
            printf("\ndifference =%d", t);
            }
        break;
        default:
            printf("\ninvalid choice");
        }
    getch();
    }


[edit]кодовый блок исправлен, добавлен отступ - OriginalGriff [/edit]

Что я уже пробовал:

Исправление, которое помогло мне выполнить код, заключается в следующем

scanf(" %c", &opt); // code without problem //


то есть я вставил пробел между " и %c, и код сработал.

Пожалуйста, помогите мне понять разницу.

1 Ответов

Рейтинг:
0

OriginalGriff

Разница в том, что scanf использует строку формата буквально: необходимость пробела подразумевает, что ваш ввод не'+', А имеет пробелы перед ним. "%c" - это "специальный" код scanf: он вообще не пропускает пробелы (в отличие от "%d", который это делает). Таким образом, когда ваш пользователь ввел два значения, Терминатор, вероятно, был "оставлен в буфере" и возвращен в качестве первого символа вместо " * "или"+", которые ввел пользователь.

Честно говоря, вам, вероятно, было бы лучше использовать getch и цикл с определенным символом "exit" вместо того, чтобы читать один символ и останавливаться.
Лично? Я бы запросил каждое число в отдельной строке, прочитал его как массив символов и отсканировал его в число - таким образом, я мог бы справиться с ошибками пользовательского ввода вместо сбоя, как это сделает ваш код. Тогда я бы использовал getch для оператора.