Проблема здесь:
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 символов не обрабатывается должным образомеще.