Проблема здесь:
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 символов еще не обработан должным образом.
Из документации Qt :
The Meta- Компилятор объектов, moc, программа, которая обрабатывает Qt C ++ расширения.
Инструмент moc читает файл заголовка C ++. Если он найдет один или несколько классов объявления, содержащие Q_OBJECT макрос, он создает исходный файл C ++ содержащий мета-объектный код для те классы. Среди прочего, метаобъектный код необходим для механизм сигналов и слотов, информация о типе времени выполнения, а система динамических свойств.
В gcc с -E
Вы видите расширенные макросы. Это - то, во что Q_OBJECT
расширяется на gcc на Linux. Знайте, это могло бы быть зависимым платформы, и он мог бы измениться в зависимости от версии QT. Вы видите, что это не просто тег для компилятора MOC.
# 11 "mainwindow.hh"
#pragma GCC diagnostic push
# 11 "mainwindow.hh"
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wsuggest-override"
# 11 "mainwindow.hh"
static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, cons
t char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private:
# 11 "mainwindow.hh"
#pragma GCC diagnostic ignored "-Wattributes"
# 11 "mainwindow.hh"
__attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
# 11 "mainwindow.hh"
#pragma GCC diagnostic pop
# 11 "mainwindow.hh"
struct QPrivateSignal {};
Он просто сообщает предварительно компилятор, что этот класс имеет элементы графического интерфейса и должен запускаться через 'moc', вам нужно только добавить это в классы, которые используют механизм сигнала / слота.
Но это будет незаметно игнорироваться в любых других классах - это просто увеличивает время сборки.