Проблема здесь:
scanf("%99[^.]", msg);
Это утверждение читает до 99 символов, но только до следующего несоответствующего символа. Теперь, если вы поставите
Привет, господин его!.
blockquote>во входном буфере, у вас действительно есть
"Hello mister him!.\n"
в буфере входного потока stdin. Теперь scanf обрабатывает все, вплоть до (но не включая) точки, поэтому точка и символ новой строки остаются во входном буфере. Следующий вызов
scanf()
scanf("%s", to);
теперь выбирает точку и символ новой строки из буфера вывода, который автоматически завершает следующую строку для чтения. Теперь входной буфер пуст и следующий scanf ожидает следующего сообщения.
Чтобы исправить это, вы можете пропустить точку и новую строку следующим образом:
scanf("%99[^.]", msg); getchar(); // Pacman (Eat the dot)
, а в другом scanf используйте s>// scanf(" %s", to); // Skip the preceding newline
( как указал HS, в этом нет необходимости.
Обратите внимание, что случай ввода сообщения> 99 символов еще не обработан должным образом.
Если вы хотите прочитать всю строку, используя 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);
}