我想在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窗体中生成的
由于
答案 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”。它会将“ä”作为第二个文本元素。