Только не понятно, почему если ввести символ, то происходит зацикливание, а не выход из цикла
В соответствии с
документацией функция возвращает количество успешно прочитанных элементов (ещё может вернуть EOF если ничего не удалось прочитать). Поэтому, если вы хотите прочитать одно число, то надо проверять, что результат равен 1:
int n;
while (scanf("%d", &n) == 1)
{
cout << "!!!" << endl;
}
В вашем случае (при вводе символа) scanf не мог преобразовать символ в число и возвращал 0. При этом он не пропускал этот символ и при следующем вызове снова его считывал