2011-11-24 101 views
1

我目前正在用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]是字符串「User#2:What's up Dick?」

themsg [1]是字符串 「39416」

第一行應該寫 「用戶#2:怎麼了迪克」到控制檯,然後是「39416」。

第二行應打印「第3階段:超級節點發送的郵件用戶#2:這是怎麼回事迪克動態端口號39416」

控制檯輸出內容如下:

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

我知道msg [0]和msg [1]是正確的,因爲我將它們的值寫入文件進行驗證。肯定會有一些奇怪的stdout問題。

對於第一行,它顯示themsg [1]的5個字符覆蓋了msg [0]的前五個字符。對於第二行,似乎忽略了cout的前兩個參數,然後添加了一個消息片段。

如果有人能幫忙,我會很感激。我嘗試使用flush()但無濟於事。我不確定輸出緩衝區是如何工作的,所以我真的很迷茫。

+1

代碼是多線程的嗎? –

+0

顯示一些代碼,包括'themsg'數組的初始化。 –

+0

問題已解決。該字符串附加了/ r虛擬回車符。哎呀! – aaronmar

回答

6

您可能有一個回車符號\r,在themsg[0]的末尾。我可以用下面的程序在Linux上重現行爲:

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

\r,不跟時\n,具有返回終端的虛擬「carriage」的行開頭的效果,所以下一個打印將覆蓋已經存在的內容。但是,您不會在文件中看到該文件,因爲該文件只包含兩個包含CR的字符串。

打印前剝去\r

+0

哇!非常感謝。它不僅解決了這個問題。我也學到了一些東西:-)。 \ r如何可以附加到我的字符串?這是否有時是串聯的結果? – aaronmar

+0

@aaronmar:他們通常會在從二進制模式下從互聯網連接或Windows文件讀取的字符串中僅剝離「\ n」。 Windows和所有基於文本的互聯網協議使用'\ r \ n'來表示行尾。C++文本模式流可能會隱藏你的內容,但二進制流不會,在Unix平臺上,文本和二進制文件是相同的。 –

0

我懷疑問題出在你的themes變量中。我測試了您的確切設置 - 並且,使用適當的值,它可以正常工作。不過,我然後測試相同的設置,但將\r附加到themsg[1]themsg[2]的末尾 - 並得到您的行爲。由於您的字符串themsg[1]來自網絡,它可能包含行結尾 - 並且來自不同的操作系統(例如UNIX和Windows) - 這會轉換爲不帶換行符的回車 - 導致您看到的行爲。