Странное поведение - PullRequest
       35

Странное поведение

1 голос
/ 24 ноября 2011

В настоящее время я пишу программу для сокетов на C ++, и по какой-то причине я наткнулся на очень странное поведение при попытке записи в консоль (необходимая задача).

cout << themsg[0] << themsg[1] << endl;
cout << "Phase 3: Supernode sent the message " << themsg[0] << " on dynamic port number " << themsg[1] << endl;

themsg [0] это строка «Пользователь №2: Как дела, Дик?»

themsg [1] это строка "39416"

В первой строке должно быть написано "Пользователь № 2: Как дела, Дик?" к консоли, затем "39416".

Во второй строке должно быть напечатано «Фаза 3: Supernode отправил сообщение. Пользователь № 2: Что случилось, Дик? На динамическом порту номер 39416»

Вывод консоли выглядит следующим образом:

394162:What's up Dick?
on dynamic port number 39416essage User#2:What's up Dick?

Я знаю, что themsg [0] и themsg [1] верны, потому что я записал их значения в файл для проверки. Это определенно должно быть какой-то странной проблемой.

В первой строке 5 символов themsg [1] перезаписывают первые пять символов themsg [0]. Во второй строке кажется, что первые два параметра для cout игнорируются, а затем добавляется фрагмент сообщения.

Если кто-нибудь может помочь, я был бы очень признателен. Я пытался использовать flush (), но безрезультатно. Я не совсем уверен, как работает выходной буфер, поэтому я действительно потерян с этим.

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

Возможно, у вас есть символ возврата каретки, \r, в конце themsg[0].Я могу воспроизвести это поведение с помощью следующей программы для Linux:

int main()
{
    std::cout << "User#2: what's up?\r" << "39416" << std::endl;
}

* * * * * * * * * * * * * * * \r * * * * * * * * * 1006терминала до начала строки, поэтому следующая печать перезапишет то, что уже было там.Вы не увидите этого в файле, так как файл будет содержать обе строки, включая CR.

Перед печатью удалите \r.

0 голосов
/ 24 ноября 2011

Я подозреваю, что проблема в вашей переменной themes.Я проверил ваши точные настройки - и с правильными значениями, он работает правильно.Однако затем я протестировал ту же настройку, но добавил \r к концу themsg[1] и themsg[2] - и получил именно ваше поведение.Поскольку ваша строка themsg[1] поступает из сети, возможно, в нее включен конец строки - и из другой операционной системы (например, UNIX против Windows) - она ​​преобразуется в возврат каретки без перевода строки - в результате выСмотрю.

...