“编程访谈曝光”中的代码练习

时间:2012-02-14 06:32:11

标签: c#

这是本书中的代码 - “编程访谈曝光”第2版 - 第78页& 79 - 删除指定的字符练习(续下)

void Main()
{
    string se = "I_am_the_string_to_modify";
    string re = "amthe";

    Console.WriteLine(se);
    Console.WriteLine(re);

    char[] s=se.ToCharArray();
    char[] r=re.ToCharArray();
    bool[] flags=new bool[128];

    int len=s.Length;
    int src,dst;

    for(src=0;src<len;++src)
    {
        Console.Write(r[src]+",");
        flags[r[src]]=true;
    }

    src=0;
    dst=0;

    while(src<len)
    {
        if(!flags[(int)s[src]])
        {
            s[dst++]=s[src];
        }
        ++src;
    }
    string str=new string(s,0,dst);
    Console.WriteLine(str);
}

如果我尝试运行这个,我会因为第18行而得到IndexOutOfRangeException: Index was outside the bounds of the array.。作者试图在第26行做同样的事情。

重点是创建一个查找数组,用于标识要删除的字符。我有一个工作版本,但我没有使用嵌套数组索引。

有没有办法让它起作用?我没有看到嵌套数组是如何工作的。

2 个答案:

答案 0 :(得分:4)

这不是C#程序。这是C源代码,扩展名为.cs。

在80年代和90年代初期,当我们C程序员学习C ++时,我们都这样做了:Think C并转换为C ++。这是学习C ++最糟糕的方式。使用C#做更糟糕的事情。用C#编程时,永远不要想C。

FWIW,这是解决您在.NET 4中的问题的LINQ

Console.WriteLine(string.Concat(se.Where(ch => re.IndexOf(ch) < 0)));

这是一个基于Regex的解决方案(可能不太好,因为它可能会失败并且有一些特殊字符):

Console.WriteLine(new Regex("["+re+"]").Replace(se, ""));

答案 1 :(得分:3)

您的问题是您正在索引r(一个5元素数组),但循环到s.Length(25)。

将第12行更改为int len=r.Length;,将第20行更改为len=s.Length;