【问题标题】:C++ split string with \0 into listC ++将带有\ 0的字符串拆分为列表
【发布时间】:2016-12-10 05:35:19
【问题描述】:

我想列出逻辑驱动器:

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'

现在我想要一个包含"C:\""D:\" 等的列表。因此我尝试了这样的事情:

std::string tmp(buffer,BUFSIZE);//to split this string then
QStringList drivesList = QString::fromStdString(tmp).split("\0");

但它没有奏效。甚至可以用分隔符\0 分割吗?或者有没有办法按长度分割?

【问题讨论】:

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

标签: c++ list split delimiter


【解决方案1】:

String::fromStdString(tmp) 的问题在于它只会从缓冲区中第一个以零结尾的“条目”创建一个字符串,因为这就是 标准字符串 的工作方式。这当然是可能的,但您必须自己手动完成。

您可以通过找到第一个零,提取子字符串,然后在循环中找到两个连续的零,这样做。

伪代码:

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;
}

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2019-04-16
    • 1970-01-01
    • 2015-09-01
    • 2011-11-13
    • 1970-01-01
    • 2020-04-14
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多