【问题标题】:Turn a C string with NULL bytes into a char array将具有 NULL 字节的 C 字符串转换为 char 数组
【发布时间】:2009-12-15 22:57:00
【问题描述】:

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

在 PHP 中我会这样做:

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

但由于我是 C 新手,所以我不知道自己在做什么。

【问题讨论】:

  • 你至少可以尝试一下。
  • @Shoosh:我倾向于同意这是了解指针等的唯一方法...... ;)
  • 请记住,这里的大多数解决方案都以文件列表末尾的双空为前提。
  • P.S.当您谈论 ASCII 字符 \0 时,它是“NUL”。
  • 什么意思,我至少可以尝试一下?我不知道自己在做什么,难道我只是神奇地应该知道吗?

标签: c winapi


【解决方案1】:

你可以这样做来循环字符串:

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 以 两个 空字符结尾时才有效。否则,它将继续打印出内存块,直到它碰巧遇到两个等于 0 的连续字节,或者直到它导致一个段错误。
  • 没错,但缓冲区确实是双空终止的。请参阅 MSDN 中的 GetOpenFileName。
【解决方案2】:

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

GetOpenFileName( &ofn );

LPSTR pszFileName = ofn.lpstrFile;

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

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

【讨论】:

  • 那行不通。它给了我一个关于“+=”不能做左手作业的错误。
【解决方案3】:

字符串副本对你有用吗?

LPSTR ptrFileName; 字符缓冲区[100]; strcpy(buf, ptrFileName); /* 现在迭代 */ for (int nLoopCnt = 0; nLoopCnt

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多