Visual C ++:我想将字符串中的第3个字符设置为'C'
。
如果我尝试
String^ s1="XXXXXX";
s1[2]="C";
编译器说:
'System::String::default': property does not have a 'set' method
有什么想法吗?
答案 0 :(得分:3)
System :: String类型是 immutable ,这是一个昂贵的单词,只是意味着它没有一个方法或属性可以让你在创建后更改字符串。这给出了类型非常的理想行为。它始终是线程安全的,您可以轻松地将字符串传递给函数,而不必担心函数会改变它。换句话说,它的行为类似于值,就像 int 一样。
但是奖牌的另一面是它不会让你做你想做的事情,编译器会提醒你这是不可能的。您必须创建 new 字符串对象。 Microsoft.VisualBasic命名空间有一个方便的方法,但是当他们看到这个名字时,每个人都将他们的内衣捆绑在一起。所以明确地写下来:
String^ s1="XXXXXX";
s1 = s1->SubString(0, 2) + 'C' + s1->SubString(3);
或更普遍:
String^ ReplaceAt(String^ str, String^ subst, int index)
{
return str->Substring(0, index) + subst + str->Substring(index + subst->Length);
}
如果您正在做很多事情,重复创建字符串对象并不是很便宜,那么您想要使用StringBuilder。
答案 1 :(得分:1)
C ++ / CLI String
是不可变的,因此一旦创建,您就无法更改其内容,如错误消息所示。
s1[2]='C';
语法(注意字符C周围的单引号,而非双引号)适用于标准C ++ std::string
。
答案 2 :(得分:0)
您可以在本机字符串中进行转换并将其转换回托管字符串。
#include <msclr\marshal_cppstd.h>
System::String^ managed = "XXXXXX";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);
unmanaged[2]='C';
System::String^ managed2 = String(unmanaged.c_str());
希望有所帮助,