Visual C ++系统字符串,返回对字符串中位置处的字符的引用

时间:2013-11-16 13:50:31

标签: string c++-cli

我想在visual c ++中得到一个字符串的特定字符,就像这个例子(c ++):

string str = "String";
cout << str.at(4);    // The member function String::at  will return 'i'

但如果我使用类字符串

,这是可能的

在visual c ++中,我想使用System :: String

label1->Text = "String";
String^ text = label1->Text;      //Get text of label
Messagebox::Show( text->at(4) );  //Return the character 'i'

错误:'at':不是'System :: String'的成员

这意味着函数at不是System :: String的成员......是否还有其他可以使用的函数?

我正在使用Visual Studio c ++ 2010 ...该应用程序是在Windows窗体中生成的

由于

3 个答案:

答案 0 :(得分:2)

  

21个重载中没有一个可以转换所有参数类型

右。但请仔细阅读错误消息, Show()方法的所有重载都不适用。它并没有抱怨运营商[],一个很好,并且做了你期望它做的事情。如果您仔细考虑一下这是有道理的,您永远不会使用MessageBox来显示单个字符。只有一个字符串。所以这有效:

  String^ text = "String";
  Char ch = text[4];
  MessageBox::Show(gcnew String(ch, 1));

但是你当然不会编写这样的代码,所以请退后一步,回顾一下你想要实现的目标。避免假设STL模板类与它们的.NET等价物类似,让垃圾收集器使集合类更容易实现。

答案 1 :(得分:0)

尝试使用数组索引:

Messagebox::Show( text[4] );  //Return the character 'i'

<强>更新

正如Hans Passant所指出的,这个解决方案的问题不在于数组索引。它试图将Char传递给Messagebox :: Show,它接受一个字符串。有关更多信息,请参阅他的解决方案。

答案 2 :(得分:0)

其他答案是在System :: String中提供第五个 codeunit 。虽然这更像是你的C ++代码,但它可能不是你想要的。

System :: String是UTF-16LE编码中经过代码单元计数的Unicode字符序列。在此编码中,字符的代码点可能是一个或两个代码单元。因此,直接索引到System :: String会跳过未知数量的字符,如果你位于具有两个代码单元的代码点中间或中间,则只能得到代码点的一半。

如果您想要第五个 字符 ,则需要使用System.Globalization::StringInfo类。

new StringInfo(text)->SubstringByTextElements(4, 1) 

显然,它返回一个System :: String,因为System :: Char是一个代码单元类型,不足以容纳一个代码点。

注意:此类处理组合表单和字符,这些表单和字符需要多个代码单元用于其代码点。

尝试“na \ u0308ive”。它会将“ä”作为第二个文本元素。