我使用的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