LINUX.ORG.RU

Си ввод/вывод


0

1
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char ch1 = 0;
    char ch2 = 0;

    scanf("%c", &ch1);

    scanf("%c", &ch2); // просто проскакивает при этом stdin = '\n'

    printf("%c", ch1);
    printf("%c", ch2);


    return 0;
}

С цифрами и массивами всё нормально.

Пока изобрёл «while (getc(stdin) != '\n');», но это как то на шаманство похоже.

В чем вопрос-то? Учитесь внятно излагать.

Что такое «просто проскакивает»? Если вы ввели 2 и более символа, например 'a' и '\n', то первые 2 попадут в ch1 и ch2.

anonymous ()

Потому что в буфере ввода остается символ переноса строки и следующий вызов scanf берет его.

encyrtid ★★★★★ ()
Ответ на: комментарий от keeper_b

Никак. fflush(stdin) в линуксе не работает. Лучше всего считывать данные в строковой буфер и оттуда выдергивать нужный символ. Примерно так.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char ch1 = 0;
    char ch2 = 0;

    char buffer[5];
    fgets(buffer, sizeof(buffer), stdin);
    ch1 = buffer[0];
    fgets(buffer, sizeof(buffer), stdin);
    ch2 = buffer[0];

    printf("%c", ch1);
    printf("%c", ch2);


    return 0;
}
encyrtid ★★★★★ ()
Ответ на: комментарий от encyrtid

Только это не будет работать если ввод превысит размер буфера. В этом случае следующий вызов fgets начнет читать данные, которые остались в буфере stdin.

encyrtid ★★★★★ ()
Ответ на: комментарий от keeper_b

>Почему этого не происходит когда вводятся цифры?

Потому что '\n' не попадает в категорию цифр и пропускается как whitespace. Не надо использовать scanf для чтения неформатированного потока. Для этого, как справедливо заметили, есть getc/fgetc/fgets/fread/etc.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.