如何调整 std::string 的大小以删除所有空终止符?

新手上路,请多包涵

我正在使用 std::string 与需要 char* 和长度字段的 C 库接口:

 std::string buffer(MAX_BUFFER_SIZE, '\0');
TheCLibraryFunction(&buffer[0], buffer.size());

但是,字符串的 size() 是实际大小,而不是包含实际有效非空字符的字符串的大小(即相当于 strlen() )。告诉 std::string 减小其大小以便只有 1 个结束空终止符没有显式空终止符的最佳方法是什么?我能想到的最佳解决方案是:

 buffer.resize(strlen(buffer.c_str()));

甚至:

 char buffer[MAX_BUFFER_SIZE]{};
TheCLibraryFunction(buffer, sizeof(buffer));
std::string thevalue = buffer;

希望有一些内置/“现代 C++”的方式来做到这一点。

编辑

我想澄清我之前提到的“结束空终止符”要求。我并不是说我想要在 std::string 的缓冲区中明确地使用 1 个空终止符,我或多或少地想到了来自 basic_string::c_str() 的字符串,它有 1 个空终止符.但是,出于 resize() 的目的,我希望它代表 实际 非空字符的大小。对困惑感到抱歉。

原文由 void.pointer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

有很多方法可以做到这一点;但对我来说,似乎最“C++”而不是 C 的可能是:

 str.erase(std::find(str.begin(), str.end(), '\0'), str.end());

即擦除从第一个 null 到结尾的所有内容。

原文由 UKMonkey 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以这样做:

 buffer.erase(std::find(buffer.begin(), buffer.end(), '\0'), buffer.end());

考虑 std::basic_string::erase 有一个重载:

 basic_string& erase( size_type index = 0, size_type count = npos );

更简洁的方式:

 buffer.erase(buffer.find('\0'));

原文由 llllllllll 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题