用C++将带有\0的字符串分割成列表。

4
我想列出逻辑驱动器的信息,包括:
const size_t BUFSIZE = 100;
char buffer[ BUFSIZE ];
memset(buffer,0,BUFSIZE);

//get available drives
DWORD drives = GetLogicalDriveStringsA(BUFSIZE,static_cast<LPSTR>(buffer));

缓冲区现在包含:'C',':','\\','0'
GetLogicalDriveStringA()之后的缓冲区
现在我想要一个填充着"C:\""D:\"等等的列表。因此我尝试了以下内容:
std::string tmp(buffer,BUFSIZE);//to split this string then
QStringList drivesList = QString::fromStdString(tmp).split("\0");

但是它没有起作用。使用分隔符\0进行分割是否可能?或者是否有一种按长度分割的方法?


1
因为 \0 结束了字符串,所以我猜你不能将其用作分隔符。 - rocambille
1
GetLogicalDriveStrings返回的“list”是双null字符终止的(在您的内存视图快照中不方便地省略)。因此,您可以通过使用循环的strlen和指针算术获得每个段的长度来枚举字符串,直到遇到零长度段为止。当发生这种情况时,你就完成了。 - WhozCraig
是的,这是我的第一种方法:while(i<drives){ i += strlen( &buffer[i] ) + 1; }它可以工作,但我希望能找到一个更好的解决方案,可以遍历列表。 - Drayke
1个回答

5
< p >使用String::fromStdString(tmp)的问题在于它只会从您的缓冲区中的第一个零终止"条目"创建一个字符串,因为这就是标准字符串的工作方式。这当然是可能的,但是您必须自己手动完成。< /p> < p >您可以通过查找第一个零,提取子字符串,然后在循环中直到找到两个连续的零,执行相同的操作。< /p> < p >伪代码:< /p>
current_position = buffer;
while (*current_position != '\0')
{
    end_position = current_position + strlen(current_position);
    // The text between current_position and end_position is the sub-string
    // Extract it and add to list
    current_position = end_position + 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接