将这一行从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#中似乎没有等效的

将这一行从c++转换为c#

这是指针运算。str - 1从char指针中减去1,使其指向内存中前面一个字符开始的字符串。这与砍掉第一个角色正好相反——它会把第一个角色放回去!

在c#中,你不能这样做。但是,为了使它有效,应该有一个字符早先被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#(没有不安全代码)不允许这些操作