文字を削除するための 3 つのオプション (ご質問のとおり) は、そのままにしておく必要があるかどうかdata_
、または単に文字をすばやく簡単にストリーミングする方法が必要な場合に応じて異なります。また、最後のオプションは、ヌル文字を別の (単一の) 文字に置き換える簡単な方法を示しています。C++11 をサポートしている場合は、これらすべてをラムダとして実装して、コードをより簡潔にすることができます。
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
char c[] = "Ch\0ad\0's Answ\0\0\0er.";
std::string data(c, c+19);
std::string c1;
struct is_null
{
bool operator()(const char c) const
{
return c == '\0';
}
};
// if you need to keep data_ intact (copy)
std::remove_copy_if(
data.begin(),
data.end(),
std::back_inserter(c1),
is_null());
std::cout << c1 << "\n";
// if you don't need to keep data intact, remove inline
std::string::iterator nend = std::remove_if(
data.begin(),
data.end(),
is_null());
data.erase(nend, data.end());
std::cout << data << "\n";
// simplest approach, just stream out each byte and skip the null characters
for(int x = 0; x < 19; ++x)
{
if(c[x] != '\0')
cout << c[x];
}
cout << "\n";
// If you want to decorate the null characters instead
std::string data2(c, c+19);
std::replace_if(
data2.begin(),
data2.end(),
is_null(),
'#'); // <--- this is the character that will replace the nulls
cout << data2 << "\n";
}