这是本书中的代码 - “编程访谈曝光”第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行做同样的事情。
重点是创建一个查找数组,用于标识要删除的字符。我有一个工作版本,但我没有使用嵌套数组索引。
有没有办法让它起作用?我没有看到嵌套数组是如何工作的。
答案 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;
。