2013-03-09 91 views
4

所以,我試圖在我的程序中使用stringstream,以獲得某些格式化的字符串(尤其是因爲我需要將數字轉換爲字符串)。爲什麼stringstream會產生奇怪的值?

的事情是,我的程序崩潰,當我與Visual Studio調試它,在我的間諜的窗口,我看到我的字符串流的字符串緩衝區收益率(嘗試添加「幀率」,就當):

「FramerateÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ」

代碼:

std::stringstream s; 
s << "Framerate"; 

我的代碼,然後將崩潰的那一刻我試圖讓關聯的字符串... 我找不到任何解釋爲了這,也沒有問題與我的代碼...

編輯:原來這些字符不是問題,並且stringstream返回預期的字符串與str()

+1

關於崩潰,**顯示代碼**。關於緩衝區未使用部分的任意內容,你期望什麼。 – 2013-03-09 05:54:22

+1

我的猜測是你最終不提供\ 0字符,但是我不能說沒有更多的代碼。 – Benjamin 2013-03-09 05:55:51

+0

@Benjamin爲什麼你最後應該提供'\ 0'? – user93353 2013-03-09 05:59:43

回答

5

stringstream的內部緩衝區不需要以空終止。但是,當您在stringstream對象上調用str()時,您將得到一個以空字符結尾的字符串。很可能你的崩潰的原因是在其他地方。

+0

的確......我剛剛意識到這一點,雖然我仍然不知道崩潰從何而來,但當我得到與流相關的字符串時,奇怪的角色消失了......我可能也跳了一下快速的結論是,我的崩潰顯然是由於這些奇怪的字符... – JBL 2013-03-09 06:02:32

0

在visual studio 2015版本14.0.25431.01更新3中,它看起來像std :: strstream並不能確保'str()'返回的數據是空終止的。

我跑了試驗用:

`std::strstream s; 
s << "the cow jumped over the moon!"; 
return s.str();` 

,並得到: the cow jumped over the moon!===zzzz

加入s.write("", 1);返回固定我的輸出,但非常不愉快了。

+0

我跑到這個權利後,我評論道:「之前任何調用str()使用結果作爲C字符串,緩衝區必須爲空終止,通常使用std :: ends。「我也被stringstream vs strstream弄糊塗了。如果有其他人跑到這裏,留在這裏。 – user1633759 2017-11-01 22:44:29