将这一行从c++转换为c#
本文关键字:c++ 转换 一行 | 更新日期: 2023-09-27 18:16:35
我有一个c++方法:-
const char *match(const char *str)
{
if( *str == ''0' || *str == ')' )
{
return str;
}
if( *str == '(' )
{
// This is equivalent to str.SubString(1) in C#.
const char *closer = match(++str);
if( *closer == ')' )
{
// Same here too closer.Substring(1).
return match(++closer);
}
// Wasn't sure about this.
return str - 1;
}
return match(++str);
}
str - 1在c++中是什么意思?我是c++的新手,主要用c#写代码。
谢谢。
我已经更新了方法-基本上它是试图找出括号是否匹配,即
I/p:"()"——有效我/P:"()"——无效。我已经为我所理解的添加了内联注释,有"str - 1"行问题,在c#中似乎没有等效的
这是指针运算。str - 1
从char指针中减去1,使其指向内存中前面一个字符开始的字符串。这与砍掉第一个角色正好相反——它会把第一个角色放回去!
str + 1
截断。您必须在代码中找到较早的操作并保存原始字符串,以便您可以反转它。
或者,str - 1
可能只是为了抵消后面出现的str + 1
,这样它就不会砍掉第一个字符。如果指针没有同时使用,将是安全的逻辑将在大多数平台上工作(尽管是未定义的行为)。
str - 1
行获取在str
之前一个字符的指针。它有效地获得了作为参数传递的原始指针,因为它在前几行用++str
向前移动了一个字符。
一个简单的转换是这样的:
string Match(string str)
{
if( str.Length == 0 || str[0] == ')' )
{
return str;
}
if( str[0] == '(' )
{
string closer = Match(str.Substring(1));
// The original code has a hidden check for termination here!
// If *closer was ''0', it would not enter the if
// Let's keep that and avoid IndexOutOfRange.
if( closer.Length > 0 && closer[0] == ')' )
{
return Match(closer.Substring(1));
}
// The original just restored the pointer to its initial state.
// Since C# strings are immutable, we can just return the original string.
return str;
}
return match(str.Substring(1));
}
但是,这会创建许多无关的字符串。你应该避免这种情况。一种可能的解决方案是更改方法,将索引作为第二个参数,并使用它来模拟指针。
int Match(string str, int i)
{
if( str.Length == i || str[i] == ')' )
{
return i;
}
if( str[i] == '(' )
{
int closerIdx = Match(str, i+1);
if( str.Length > closerIdx && str[closerIdx] == ')' )
{
return Match(str, closerIdx+1);
}
return i;
}
return Match(str, i+1);
}
然后写一个小的bootstrapper:
string Match(string str)
{
int idx = Match(str, 0);
return str.Substring(idx);
}
在c#中没有unsafe
标志是不可能的。
c++将字符串视为指向char(char *)数组的指针。
c#将string作为类的实例。
c++允许指针运算
通常c#(没有不安全代码)不允许这些操作