我使用的GetOpenFileName
具有多種選擇功能。拾取的文件將在LPSTR中返回。在LPSTR內部,所選文件用NULL字節分隔。我想將LPSTR分成一個數組,然後遍歷該數組。將NULL字節的C字符串轉換爲char數組
在PHP中,我會做:
$array = explode("\0", $string);
但因爲我是新來的C,我不知道我在做什麼。
我使用的GetOpenFileName
具有多種選擇功能。拾取的文件將在LPSTR中返回。在LPSTR內部,所選文件用NULL字節分隔。我想將LPSTR分成一個數組,然後遍歷該數組。將NULL字節的C字符串轉換爲char數組
在PHP中,我會做:
$array = explode("\0", $string);
但因爲我是新來的C,我不知道我在做什麼。
你可以通過字符串這樣對循環:
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);
可以適應這個代碼來創建數組,如果真的有必要。
請注意,只有在LPSTR以*兩個空字符結尾的情況下,這纔會起作用。否則,它將繼續打印出大塊內存,直到碰巧碰到兩個連續的字節爲零,或者直到它導致段錯誤。 – 2009-12-15 23:11:23
這是真的,但緩衝區確實是雙空終止的。請參閱MSDN中的GetOpenFileName。 – 2009-12-15 23:13:29
這是唯一適用於我的方法。謝謝。 – 2009-12-16 01:30:07
字符串副本會爲你做詭計嗎?
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 */ }
希望這有助於 最好的問候, 湯姆。
最簡單的事情可能就是直接循環返回的字符串。 (有沒有必要創建一個單獨的數組。)該代碼會是這個樣子(檢查省略錯誤):
GetOpenFileName(&ofn);
LPSTR pszFileName = ofn.lpstrFile;
while(*pszFileName != 0)
{
// do stuff...
pszFileName += strlen(pszFileName) + 1;
}
另外,不要忘記,如果用戶選擇多個文件,第一個條目會文件夾名稱。
這不起作用。它給了我一個關於'+ ='不能做左手任務的錯誤。 – 2009-12-16 00:27:19
你至少可以做的就是嘗試。 – shoosh 2009-12-15 23:02:11
@Shoosh:我傾向於認爲它是瞭解指針等的唯一方法......;) – t0mm13b 2009-12-15 23:09:02
請記住,這裏的大多數解決方案都假設文件列表末尾有一個雙null。 – Jherico 2009-12-15 23:22:16