VC ++如何更改字符串中特定位置的字符?

时间:2015-01-10 11:12:33

标签: string c++-cli

Visual C ++:我想将字符串中的第3个字符设置为'C'

如果我尝试

String^ s1="XXXXXX";
s1[2]="C";

编译器说:

'System::String::default': property does not have a 'set' method

有什么想法吗?

3 个答案:

答案 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());

希望有所帮助,