2011-05-24 73 views
2

這個過程在這裏解釋: http://msdn.microsoft.com/en-US/library/d1ae6tz5%28v=VS.80%29.aspx 我從那篇文章沒有得到的是固定的wchar_t *被傳遞給依賴尾隨空字符的各種C字符串函數。 .NET字符串是否有尾隨空字符的規則? System.String文檔說:將System :: String轉換爲wchar_t * - 如何確定結束?

在.NET Framework中,空字符可以嵌入到字符串中。當一個字符串包含一個或多個空字符時,它們包含在總字符串的長度中。

回答

2

據我瞭解,在.NET CLR字符串內部字符緩衝區是空值終止的,雖然這自然空字符不使其進入字符計數,所以任何.NET代碼會忽略它。這個null的唯一原因是可以輕鬆地與Windows API或其他純C代碼進行互操作,這些代碼需要字符串以null結尾。相反,追加空字符任何時候一個.NET字符串將被傳遞到一個C API(也可能有重新分配並複製整個字符串),空字符就在那裏從第一地方 - 在真實有用的優化因爲.NET仍然需要在幕後進行大量的互操作,即使你沒有明確地使用它。

如果你碰巧在你的字符串的中間中有一些空字符,那麼任何得到你的字符串的C API都可能會停在那裏,永遠不會到達字符串的末尾。我想你甚至可以自己嘗試在C++/CLI中看看會發生什麼。 :)

+0

實際上,當我檢索System :: String的wchar_t *時,在文本結束之後和空字符之前看到一對垃圾字符。也許這與字符串來自Windows.Forms.TextBox的事實有關? – andriej 2011-05-24 22:49:15

+0

也許,雖然我不明白爲什麼。 Windows.Forms.TextBox的文本當然必須通過Windows API(這將要求它以空終止),但我不知道爲什麼你會在那裏得到垃圾。 – 2011-05-24 23:22:25

0

只是猜測,因爲我沒有獲得微軟內部。

它沒有明確規定,但爲wchar_t *字符串應始終以空字符終止。這個例子支持這個,因爲它使用依賴於這個特性的printf_s函數。

PtrToStringChars功能授權訪問內部字符串緩衝區。該函數可能會將空字符添加到緩衝區中,而不將其包含在字符串的字符數中,因此字符串的.NET用戶將看不到null。

+0

PtrToStringChars()在[vcclr.h]中定義(http://www.google.com/codesearch/p?hl=en#ep_dW72sfTE/trunk/trunk/include/ntddk/inc/ddk/ wlh/vcclr.h&q = file:vcclr.h&sa = N&cd = 1&ct = rc)包含文件,因此您可以自己查看。它似乎沒有將字符附加到字符串緩衝區或以任何方式進行修改。它只是給你指向內部字符緩衝區的指針。 – 2011-05-24 21:19:30

+0

@Boaz Yaniv,感謝您的鏈接。我沒有看到任何追加。我必須假定其他字符串函數在緩衝區末尾保留一個空值,而不將其包含在字符數中。 – 2011-05-24 21:23:26

+0

有幾乎有關的任何信息,但一些文章中,我發現了討論這個問題似乎[表明](http://csharpindepth.com/Articles/General/Strings.aspx)。 – 2011-05-24 21:31:04