我使用现有字符串创建了一个新字符串。 假设初始字符串是
string a="sample";
,新创建的字符串是
string b=a;
现在我已将空字符放在第二个索引处。
b[2]='\0';
当我尝试输出b字符串时。
输出显示为saple
。
我想在index-1之后结束字符串。
这种行为是否正常。如果在第一个索引之后如何结束字符串是正常的。
谢谢..
答案 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 :(得分: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)
。