2012-05-15 14 views
1

所以我有兩個字符串填充,但現在我希望他們顯示和修剪()似乎並不想這樣做。c#字符串填充現在想要它短

String devicename = "".PadRight(100); 

String deviceversion = "".PadRight(100); 

bool isDeviceReady = capGetDriverDescriptionA(i, ref devicename, 100, ref deviceversion, 100); 

後來我用像琴絃在下面:

Messagebox.show("Device Name="+devicename.Trim()+" , Device Version="+deviceversion.Trim()); 

所有這一切都顯示爲 「Device Name=name of the device

的思考?

+0

@Brian。讓我們知道您期待看到什麼,以及您_think_ Trim會爲您做些什麼。坦率地說,我沒有看到你向我們展示的任何意外。 – Jim

+0

@Jim意想不到的是消息框不顯示「Device Version = ...」 - 只有字符串的第一部分。原因是恕我直言,'devicename'字符串包含'null'值,所以MessageBox忽略字符串的其餘部分。 –

+0

@TomasPetricek,是的,你是對的「設備版本」不在那裏。不得不說我錯過了。就字符串_containing_空值而言,我不能說這個,但似乎是合理的。我太擔心PadRight vs. Trim「問題」 – Jim

回答

0

最後它很簡單。 Tomas Petrick走上了正軌。它返回的字符串是一個空字符串(也稱爲零終止)。然後,我只需要從字符串中刪除空終止符。

devicename = devicename.trim('\0'); 
+0

在循環中使用它時,我需要將字符串重置爲原始「devicename =」「.PadRight(100);」 API不喜歡它被修剪。 –

2

你爲什麼填充字符串?看起來你只是用空格填充字符串,稍後會被內容替換,但從你的問題來看,我不明白爲什麼這是必要的。什麼是錯的只是:

String devicename = ""; 
String deviceversion = ""; 

bool isDeviceReady = capGetDriverDescriptionA(i, ref devicename, 100, ref deviceversion, 100); 
+0

也許OP認爲字符串是可變的? –

+0

從技術上講,這不是一個答案,這是一條評論,但這次沒有倒下,因爲評論太長了,因爲我同意你的看法。 – David

+0

你已經對API調用做了一些假設,我遇到過很多你提供API填充的緩衝區的地方。這個答案和評論是脫離主題。 – joocer

1

你可以嘗試調用返回一個0結尾的字符串的API函數時使用StringBuilder,而不是string。你得到的行爲可能來自於API在字符串末尾寫入零值(終止它)的事實,而.NET將它視爲包含零值的正常字符串。

或者,請查看this discussion,它建議使用[MarshalAs(UnmanagedType.LPWSTR)]屬性註釋該參數。然後PInovke機制應該在最後自動處理零值。

+0

我想這是有道理的。雖然StringBuilder似乎不工作。 –