Прочитайте два символа последовательно, используя scanf() в C

Я пытаюсь ввести два символа от пользователя t количество раз. Вот мой код:

int main()
{
    int t;
    scanf("%d",&t);
    char a,b;

    for(i=0; i<t; i++)
    {
        printf("enter a: ");
        scanf("%c",&a);

        printf("enter b:");
        scanf("%c",&b);
    }
    return 0;
}

Как ни странно, вывод в первый раз:

enter a: 
enter b:

То есть код не ждет значения a.


person coder_r    schedule 07.06.2014    source источник


Ответы (3)


Проблема в том, что scanf("%d", &t) оставляет новую строку во входном буфере, который используется только scanf("%c", &a) (и, следовательно, a назначается символом новой строки). Вы должны использовать новую строку с getchar();.

Другой подход заключается в добавлении пробела в спецификатор формата scanf() для игнорирования начальных пробельных символов (включая новую строку). Пример:

for(i=0; i<t; i++)
{
    printf("enter a: ");
    scanf(" %c",&a);

    printf("enter b: ");
    scanf(" %c",&b);
}

Если вы предпочитаете использовать getchar() для использования новых строк, вам нужно сделать что-то вроде этого:

for(i=0; i<t; i++)
{
    getchar();
    printf("enter a: ");
    scanf("%c",&a);

    getchar();
    printf("enter b:");
    scanf("%c",&b);
 }

Я лично считаю первый подход лучше, потому что он игнорирует любое произвольное количество пробелов, тогда как getchar() просто потребляет один.

person Filipe Gonçalves    schedule 07.06.2014
comment
...или вы можете поставить пробел перед %c в scanf---› scanf(" %c", &a). - person haccks; 07.06.2014
comment
@hackks Да, правда, я добавлю это к своему ответу - спасибо за совет;) - person Filipe Gonçalves; 07.06.2014
comment
просто добавление getchar перед циклом не работает. Однако добавление getchar только в начале цикла и в конце цикла работает в этом случае. - person coder_r; 07.06.2014
comment
@babji Да, использование только цикла getchar()before не сработает. Я понял это, но затем отредактировал свой ответ и забыл удалить эту часть. Спасибо, что заметили, но я удалил это сейчас. - person Filipe Gonçalves; 07.06.2014
comment
@FilipeGonçalves: Спасибо, узнал кое-что новое, прочитав ваш замечательный ответ. - person Destructor; 10.02.2016

Увидев ваш код, он идеален, он должен читать T раз A и B, но он заменяет A и B каждый раз для каждого цикла.

Используйте массив или хеш-таблицу для эффективного хранения

person Saiteja prasadam    schedule 07.06.2014
comment
Вопрос касается только ввода, а не обработки a и b, поэтому вы отвечаете на другой вопрос, а не на этот. - person Rob11311; 07.06.2014
comment
Извините, я не понял вашего вопроса, надеюсь, это поможет - person Saiteja prasadam; 07.06.2014

Некоторые форматы, используемые с scanf, обрезают новую строку от stdin, а другие нет. Чтение с использованием "%d" относится к последней категории. Вам нужно прочитать новую строку '\n' перед чтением в

scanf("%c", &a);
person 4pie0    schedule 07.06.2014