在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()字符。