将包含空字节的C字符串转换为字符数组

将包含空字节的C字符串转换为字符数组,c,winapi,C,Winapi,我正在使用具有多个选择功能的GetOpenFileName。拾取的文件在LPSTR中返回。在此LPSTR中,所选文件由空字节分隔。我想将LPSTR拆分为一个数组,然后在该数组上循环 在PHP中,我将执行以下操作: $array = explode("\0", $string); 但由于我是C新手,我不知道我在做什么。您可以这样做来循环字符串: char *Buffer; // your null-separated strings char *Current;

我正在使用具有多个选择功能的
GetOpenFileName
。拾取的文件在LPSTR中返回。在此LPSTR中,所选文件由空字节分隔。我想将LPSTR拆分为一个数组,然后在该数组上循环

在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 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 */ } LPSTR-ptrFileName; char-buf[100]; strcpy(buf,ptrFileName); /*现在迭代*/ 对于(int nLoopCnt=0;nLoopCnt<(sizeof(buf)/sizeof(buf[0]);nLoopCnt++){ char ch=buf[nLoopCnt]; /*不管你怎么对待他*/ } 希望这有帮助, 顺致敬意,
Tom.

最简单的方法可能就是直接循环返回的字符串。(不需要创建单独的数组。)代码如下所示(省略错误检查):


另外,不要忘记,如果用户选择多个文件,第一个条目将是文件夹名称。

至少您可以尝试一下。@Shoosh:我倾向于同意,因为这是了解指针等的唯一方法。…)请记住,这里的大多数解决方案都假定在文件列表的末尾有一个双空。当您谈论ASCII字符\0时,它是'NUL'。您的意思是,我至少可以尝试一下吗?我不知道我在做什么,我只是神奇地应该知道吗?注意,只有当LPSTR以两个空字符结尾时,这才有效。否则,它将继续打印内存块,直到它恰好运行到两个连续的等于零的字节,或者直到它导致segfault。这是真的,但缓冲区确实是双空终止的。请参阅MSDN中的GetOpenFileName。这不起作用。它给了我一个关于“+=”不能做左手作业的错误。
GetOpenFileName( &ofn );

LPSTR pszFileName = ofn.lpstrFile;

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