在C ++中的string中的NUL char

在下面的代码中,我试图用'\0'replace第一个字符。

我期望它打印一个空string,但在输出中,它只是省略,并显示其余的字符。

 int main() { string str; cin >> str; str[0] = '\0'; cout << str << "\n"; return 0; } 

输出:

  testing esting 

如何在C ++中终止string?

PS:我正在试图终止string在另一个问题,我需要终止之间的方法。

std::string不是以空字符结尾的string。 如果你想清空它使用clear()方法。 如果你想删除string的一个元素,使用erase()方法。

string有两种方法。

在C中,string是零终止的,意思是'\ 0'表示string的结尾,这就是你所期望的。

C ++(和大多数语言)使用计数的string,这意味着string的末尾被索引,因此向string添加空终止符将不会终止它。 '\ 0'是非打印字符,所以当你打印时,你会看到你所看到的行为。 如果你想操纵std :: string长度,你需要使用std :: string方法( http://www.cplusplus.com/reference/string/string/ )。

C ++不关心string的空终止符。 它们只是用于C兼容性。

顺便说一句,这应该有你期望的行为。

 cout<<str.c_str()<<"\n"; 

也可以看看

为什么以null结尾的string? 或者:null终止与字符+长度存储

什么是空string的基本原理?

你只是认为你有

 testing esting 

作为输出,但你真的得到了

 testing esting ^ | +-- "empty" \0 char 

因为std::string仍然有“testing”的长度,所以你用'\ 0'代替了第一个字符't'。 当std::cout获取string时,它会查看string长度并输出其所有字符,这会使'\ 0'在输出中产生一个“空”的插槽。

要真正清除string,更喜欢调用std::string::clear()std::string::reset(0)也是有效的,但它不具有performance力(你甚至可以指定一个空string…不寒而栗)。 这个实现可能根本不可能使用'\ 0',所以不要把它当作一种摆脱外部观察表示的方式。

std::string类似于std::vector的function。 如果你想删除你的std::string所有元素,你可以使用std::string::clear

 #include <iostream> #include <string> int main() { std::string str("testing"); std::cout << str << std::endl; str.clear(); std::cout << str << std::endl; } 

如果你想从你的string中删除一个特定的字符(例如,第一个字符),你可以使用std::string::erase

 #include <iostream> #include <string> int main() { std::string str("testing"); std::cout << str << std::endl; str.erase(str.begin()); std::cout << str << std::endl; } 

如果你想从你的string中删除特定的字符,你可以像std::vector使用erase-remove成语:

 #include <iostream> #include <string> #include <algorithm> int main() { std::string str("testing"); std::cout << str << std::endl; str.erase(std::remove_if(str.begin(), str.end(), [](char const &c){ return c == 't'; }), str.end()); std::cout << str << std::endl; } 

根据std :: string实现,[]返回内部char数组中给定位置的字符的引用。 当你将它设置为str [8] ='\ 0'时, 你可以通过调用str.c_str()函数来检查它。 它返回内部数组。

但是,cout在中间读取没有空字符的字符。 这是输出的原因。

 const_reference operator[](size_type __n) const { return *(_M_start + __n); } reference operator[](size_type __n) { return *(_M_start + __n); } 

要获得以第一个字符结尾的string,需要先通过调用方法string::c_str()string提取char const* 。 然后它会像你想的那样被处理(就像在C中一样)。

也许使用像printf("%s", str.c_str());这样的旧的printf printf("%s", str.c_str()); 这将打印出C风格,并应终止空字符。 像strlen(str.c_str()); 应该也能工作。 我怀疑是因为C ++string有一个.size()函数可能有一个int size; 会员,他们不会浪费任何时间检查一个空字符每次他们想要打印。 他们可能只是说打印str.size()字符。