我正在使用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个null终止符,我或多或少地想到了字符串,因为它来自basic_string::c_str()
,它有1个空终止符。但是,出于resize()
的目的,我希望它代表实际非空字符的大小。对不起,感到困惑。
答案 0 :(得分:6)
许多方法可以做到这一点;但可能对我来说似乎是最重要的一个" C ++"而不是C是:
str.erase(std::find(str.begin(), str.end(), '\0'), str.end());
即擦除从第一个空值到结尾的所有内容;这会将你的最后一个空字符保留为字符串的一部分。
答案 1 :(得分:2)
你可以这样做:
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'));
答案 2 :(得分:2)
你可以使用buffer.find(' \ 0')代替strlen(buffer.c_str())
答案 3 :(得分:0)
我知道这个问题已经有了一些答案,但是我也想为我的答案做出贡献,尽管该解决方案仅适用于字符串末尾的所有空终止符。
void rtrim_null(std::string& str) {
str.erase(std::find_if(str.rbegin(), str.rend(), [](int character) {
return '\0' != character;
}).base(), str.end());
}
答案 4 :(得分:0)
使用您的
std::string buffer(MAX_BUFFER_SIZE, '\0');
TheCLibraryFunction(&buffer[0], buffer.size());
要删除0终止符,最简单的方法是:
buffer = buffer.c_str();
(也可能最快?-没有测试)
答案 5 :(得分:0)
如果要修剪字符串中的多个字符(我想删除\r
,\n
,\0
和' '
,则使用boost::trim_if使用一个Liner :
int main()
{
std::string str("abcd \0 \r\n \0", 12);
std::cout << "Str: " << str << std::endl;
std::cout << "Length: " << str.length() << std::endl;
boost::trim_if(str, boost::is_any_of(std::string("\r\n\0 ", 4)));
std::cout << "Length: " << str.length() << std::endl;
return 0;
}
打印:
Str: abcd
Length: 12
Length: 4