2009-12-15 175 views
0

我使用的GetOpenFileName具有多種選擇功能。拾取的文件將在LPSTR中返回。在LPSTR內部,所選文件用NULL字節分隔。我想將LPSTR分成一個數組,然後遍歷該數組。將NULL字節的C字符串轉換爲char數組

在PHP中,我會做:

$array = explode("\0", $string); 

但因爲我是新來的C,我不知道我在做什麼。

+1

你至少可以做的就是嘗試。 – shoosh 2009-12-15 23:02:11

+1

@Shoosh:我傾向於認爲它是瞭解指針等的唯一方法......;) – t0mm13b 2009-12-15 23:09:02

+0

請記住,這裏的大多數解決方案都假設文件列表末尾有一個雙null。 – Jherico 2009-12-15 23:22:16

回答

3

你可以通過字符串這樣對循環:

char *Buffer;    // your null-separated strings 
char *Current;   // Pointer to the current string 
// [...] 
for (Current = Buffer; *Current; Current += strlen(Current) + 1) 
    printf("GetOpenFileName returned: %s\n", Current); 

可以適應這個代碼來創建數組,如果真的有必要。

+0

請注意,只有在LPSTR以*兩個空字符結尾的情況下,這纔會起作用。否則,它將繼續打印出大塊內存,直到碰巧碰到兩個連續的字節爲零,或者直到它導致段錯誤。 – 2009-12-15 23:11:23

+0

這是真的,但緩衝區確實是雙空終止的。請參閱MSDN中的GetOpenFileName。 – 2009-12-15 23:13:29

+0

這是唯一適用於我的方法。謝謝。 – 2009-12-16 01:30:07

1

字符串副本會爲你做詭計嗎?

 
LPSTR ptrFileName; 
char buf[100]; 
strcpy(buf, ptrFileName); 
/* Now iterate */ 
for (int nLoopCnt = 0; nLoopCnt < (sizeof(buf)/sizeof(buf[0])); nLoopCnt++){ 
    char ch = buf[nLoopCnt]; 
    /* Do whatever with ch */ 
} 

希望這有助於 最好的問候, 湯姆。

3

最簡單的事情可能就是直接循環返回的字符串。 (有沒有必要創建一個單獨的數組。)該代碼會是這個樣子(檢查省略錯誤):

GetOpenFileName(&ofn); 

LPSTR pszFileName = ofn.lpstrFile; 

while(*pszFileName != 0) 
{ 
    // do stuff... 
    pszFileName += strlen(pszFileName) + 1; 
} 

另外,不要忘記,如果用戶選擇多個文件,第一個條目會文件夾名稱。

+0

這不起作用。它給了我一個關於'+ ='不能做左手任務的錯誤。 – 2009-12-16 00:27:19

相關問題