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

时间:2018-03-21 15:33:58

标签: c++

我正在使用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()的目的,我希望它代表实际非空字符的大小。对不起,感到困惑。

6 个答案:

答案 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