2009-12-06 25 views
0

我有點卡在這裏。我正在爲Commerce Server 2009開發一個自定義Pipleline組件,但這與我的問題沒有多大關係。在C中讀取時,如何從C++中獲得 0的字符串#

在管道的設置中,我給用戶一個窗體窗體來輸入一些配置值。其中一個值是SharePoint網站的URL。 Commerce Server使用所有這些流水線內容的C++組件,因此輸入的值將被放入IDictionary中,並最終通過Microsoft的C++組件持久保存到數據庫中。

當我在流水線執行過程中讀取字符串時,它會從C++的IDictionary對象中傳遞給我。我的C#代碼看到後綴爲\ 0 \ 0的URL。我不確定這些來自哪裏,但是我的代碼因爲它不是一個有效的URI而被炸燬。在我保存並修剪它時,我正在修剪該字符串,並且仍然無法刪除這些字符。

任何想法是什麼造成了這一點,我怎麼能擺脫它?我更喜歡不要像子字符串那樣進行破解,而是根本原因。

感謝, 科瑞

+2

的\ 0來自在C/C++字符串終止與約定\ 0(又名空)。它們被稱爲「以空字符結尾的字符串」 – 2009-12-06 17:03:53

+0

您的c#代碼是否定義了封送處理?你正在得到一個IDictionary,所以有問題的字符串正在從一個對象轉換?可能會將元素換行或以其他方式將對象轉換爲適當的字符串。你可以發佈一些有問題的代碼嗎? – ongle 2009-12-06 19:04:00

回答

4

這會幫助:

string sFixedUrl = "hello\0\0".Trim('\0'); 
+2

我認爲這將解決它,但它就像Substring一樣的黑客。它沒有解決問題的原因。 – 2009-12-06 17:07:23

+0

我認爲根本原因必須是在我的控制之外的方程MS方面,正如ltcmelo所暗示的。我將使用Trim解決方案,不管是否破解,因爲它的工作原理和我通過我寫的「NullSafeString」對象讀取所有字符串,所以這足夠好,並且像冠軍一樣工作。 – 2009-12-06 19:01:16

0

this網站:

C中的一個字符串是簡單的字符數組,最後一個字符設置爲NUL字符(ascii/unicode point 0)。該空終止符是必需的;如果字符串不在那裏,則字符串不合格。 C/C++(「string」)中的字符串文字標記保證了這一點。

const char *str = "foo"; 

相同

const char *str = {'f', 'o', 'o', 0}; 

所以只要C++組件獲得您的IDictionary,它將空值終止字符串添加到年底。如果你想刪除它,你必須在返回字典之前從結尾中刪除空終止的字符。請參閱this文章,瞭解如何刪除空字符。基本上你需要知道確切的大小和修剪它。

1

正如其他人的帖子所解釋的,C中的字符串以空字符結尾。 (注意,C++已經提供了一個不依賴於字符串類型的字符串類型。)

你的情況有點不同,因爲你得到的是雙空字符結尾的字符串。我不是這裏的專家,所以如果我錯了,任何人都應該隨時糾正我。但是這看起來像是Windows中使用寬字符的unicode/i18n aware應用程序的典型字符串表示。請看看this

一個猜測是,將字符串保存到數據庫中的應用程序沒有使用「便攜」策略。例如,它可能會持續考慮其字符串緩衝區的大小,原因是原始字節爲,而不是其實際的長度爲。前者會在最後計算額外的兩個零(因此也會堅持),而後者會丟棄它們。

0

另一種可以使用的技術是字符數組和數組長度。一個字符數組不需要終止空字符。

當你通過這種數據結構,還必須通過的長度。 C風格字符串的約定是通過搜索'\ 0'(或Unicode,'\ 0 \ 0')來確定字符串的結尾。由於該數組沒有終止字符,因此總是需要長度。

更好的解決方案是使用std::string。它不會追加空字符。當您需要兼容性或C風格格式時,請使用c_str()方法。我必須在我的程序中使用這種技術,因爲GUI框架具有與std::string不兼容的自己的字符串數據類型。

相關問題