Scanf не вызывается

1
задан Ionut Eugen 16 January 2019 в 11:54
поделиться

2 ответа

Проблема здесь:

scanf("%99[^.]", msg);

Это утверждение читает до 99 символов, но только до следующего несоответствующего символа. Теперь, если вы поставите

Привет, господин его!.

во входном буфере, у вас действительно есть

"Hello mister him!.\n"

в буфере входного потока stdin. Теперь scanf обрабатывает все, вплоть до (но не включая) точки, поэтому точка и символ новой строки остаются во входном буфере. Следующий вызов scanf()

scanf("%s", to);

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

Чтобы исправить это, вы можете пропустить точку и новую строку следующим образом:

scanf("%99[^.]", msg);
getchar(); // Pacman (Eat the dot)

, а в другом scanf используйте

// scanf(" %s", to); // Skip the preceding newline

( как указал HS, в этом нет необходимости.

Обратите внимание, что случай ввода сообщения> 99 символов еще не обработан должным образом.

0
ответ дан Ctx 16 January 2019 в 11:54
поделиться

Если вы хотите прочитать всю строку, используя scanf, вы можете использовать% [^ \ n] вместо% 99 [^.]. И обязательно добавьте getchar (), если какая-либо клавиша 'enter' была нажата непосредственно перед сканированием с помощью% [^ \ n]. Изменения, показанные в приведенном ниже коде, могут быть полезны:

while (1)
{
    printf("[]:Msg to ? :");
    scanf("%[^\n]", to);
    getchar();
    printf("[]:Msg: ");
    scanf("%[^\n]", msg);
    getchar();
    printf("Sending %s\n", msg);
}
0
ответ дан Niloy Rashid 16 January 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: