如何使用null字符终止字符串

时间:2014-10-28 12:03:37

标签: c++ string

我使用现有字符串创建了一个新字符串。 假设初始字符串是

string a="sample";

,新创建的字符串是

string b=a;

现在我已将空字符放在第二个索引处。

b[2]='\0';

当我尝试输出b字符串时。

输出显示为saple

我想在index-1之后结束字符串。

这种行为是否正常。如果在第一个索引之后如何结束字符串是正常的。

谢谢..

3 个答案:

答案 0 :(得分:3)

std::string

operator<<已超载。行为将与您执行此操作不同:

char a[] = "sample";
char b[sizeof(a)];
strcpy(b, a);
b[2] = '\0';
std::cout << b;

std::cout << b.c_str();(调用const char*而不是std::string的重载。两个重载之间的区别在于const char*的重载调用std::char_traits<char>::length来确定要打印的字符数(即,终止空字符)。另一方面,std::string的重载使用str.size()std::string的大小包括嵌入其中的任何空字符。 1

为了“截断”字符串,您可以关注@Wimmel's suggestion并使用resize

std::string a = "sample";
std::string b = a;
b.resize(2);
std::cout << b;

1 STL basic_string length with null characters

答案 1 :(得分:2)

我不确定标准定义的内容应该与您当前正在进行的操作一起发生,但是正确执行您要实现的目的的方法是使用std :: string :: substr()方法,如下所示:

b = a.substr(0, index-1);

答案 2 :(得分:0)

这是正常的。
与C字符串不同,std::string的长度不是由'\0'决定的,而是有一个记录其长度的成员变量。在这种情况下,字符串内容为73 61 00 70 6c 65,因此b.length() == 6,但其中包含'\0'。您还可以将输出重定向到文件,并检查内容,它是73 61 00 70 6c 65

如果您想要截断字符串,请拨打b.resize(2)