2009-12-15 176 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

相关问题