string str = "ABCDE";
char[] chArr = str.ToCharArray();
int nIndexMax = chArr.Length - 1;
for (int i=0;i<=nIndexMax;i++)
{
if (i == nIndexMax - i)
{
continue;
}
chArr[i] ^= chArr[nIndexMax-i];
chArr[nIndexMax-i] ^= chArr[i];
chArr[i] ^= chArr[nIndexMax-i];
}
str = new string(chArr);
这里的目的是翻转字串。
但是呢,执行到str = new string(chArr);的时候,chArr中保存的是"EDCBA",执行后,str还是"ABCDE"。是为什么呢?如何可以使用chArr构造一个新的string呢?
个人认为str还是指向了原来的字串?为什么呢?谁能给解释一下。谢谢 ^_^

解决方案 »

  1.   

    你错了,chArr中保存的还是"ABCDE",所以str的值也是它,检查你的代码吧
      

  2.   

    在VS2003下,测试发现:
    - chArr {Length=0x5} char[]
    [0x0] 0x41 'A' char
    [0x1] 0x42 'B' char
    [0x2] 0x43 'C' char
    [0x3] 0x44 'D' char
    [0x4] 0x45 'E' char因为顺序没改过来,所以当然str没变了。问题应在上面:
    for (int i=0;i<=nIndexMax;i++)
    {
    if (i == nIndexMax - i)
    {
    continue;
    }
    chArr[i] ^= chArr[nIndexMax-i];
    chArr[nIndexMax-i] ^= chArr[i];
    chArr[i] ^= chArr[nIndexMax-i];
    }
      

  3.   

    string str = "ABCDE";
    char[] chArr = str.ToCharArray();
    int nIndexMax = chArr.Length - 1;
    for (int i=0;i<=nIndexMax;i++)
    {
    if (i == nIndexMax - i)
    {
    break;
    }
    chArr[i] ^= chArr[nIndexMax-i];
    chArr[nIndexMax-i] ^= chArr[i];
    chArr[i] ^= chArr[nIndexMax-i];
    }
    str = new string(chArr);
    这样就对了。我循环多了。
      

  4.   

    for (int i=0;i<=nIndexMax;i++) -> for (int i=0;i<=nIndexMax/2;i++)你的代码是想让A<->E, B<->D这样交换吧。其实循环的次数只要nIndexMax的一半就可以了,不然当字符串变成EDCBA后,你再循环,就又变回去了。
      

  5.   

    >>> 个人认为str还是指向了原来的字串
    错了,是两个字符串,一个variable name而已>>> 如何可以使用chArr构造一个新的string呢
    这是System.String类的一个构造函数而已这段代码没什么吧... 就是相当于翻转了一个数组。Array.Reverse方法也可以
    而这里的循环写的很有意思,一般会这样写:
    int nIndexMax = chArr.Length;
    for (int i=0;i<nIndexMax;i++)
    {}很少在for循环里面写<=或者>=的
      

  6.   

    string str = "ABCDE";
    char[] chArr = str.ToCharArray();
    int nIndexMax = chArr.Length - 1;
    for (int i=0;i<=nIndexMax;i++)
    {
    if (i == nIndexMax - i)
    {
    break;
    }
    chArr[i] ^= chArr[nIndexMax-i];
    chArr[nIndexMax-i] ^= chArr[i];
    chArr[i] ^= chArr[nIndexMax-i];
    }
    str = new string(chArr);
      

  7.   

    呵呵,速马前辈,为什么很少使用<=呢?是不是<=会执行两次比较<只执行一次?
      

  8.   

    string str = "ABCDE";
    char[] chArr = str.ToCharArray();
    int nIndexMax = chArr.Length - 1;
    for (int i=0;i<=nIndexMax;i++)
    {
    if (i >= nIndexMax - i)
    {
    break;
    }
    chArr[i] ^= chArr[nIndexMax-i];
    chArr[nIndexMax-i] ^= chArr[i];
    chArr[i] ^= chArr[nIndexMax-i];
    }
    str = new string(chArr);