2015-03-31 25 views
0

所以我正在为一个学校项目做这个。它的小程序是在两个方向上加密一些密码,并且我从编码加密回到正常版本。它应该读取加密版本的2个字符,将它们替换为匹配的字符并将其返回到字符串。导致原始传递中的每个字符被加密版本中的2个字符替换,通常为,.,..或类似字符。 这里是我坚持不管我做什么,下面的异常不通过一个错误消失C#索引例外unhandeled

else 
{ 
    string target; 
    text = ""; 
    password = richTextBox2.Text; 
    for (int i = 0; i <= password.Length; i += 2) 
    { 
     target = Convert.ToString(password[i]) 
      + Convert.ToString(password[i + 1]); 
     if (target == ",,") 
     { 
      text += "a"; 
     } 
    } 
    richTextBox3.Text = text; 
} 
+0

我不会告诉你答案,因为这对你没有任何帮助。相反,尝试使用调试器来找出发生异常的位置以及原因。发生异常时检查'i'的值。这个值看起来正确吗?这是一个容易解决的问题。如果您学习使用调试器,您将能够快速解决所有这些问题。 – usr 2015-03-31 20:48:23

+0

你也可以使用'Substring'而不是'Convert.ToString()'来简化你的代码。例如,你的'target'的赋值可以写成:'target = password.Substring(i,2);' – 2015-03-31 21:00:45

回答

1

关。由于您测试i <= password.Length,因此当i等于password.Length时,将会输入循环,当您尝试Password[i]时将导致OutOfBoundsException - 因为字符串是基于索引的0,所以您应该始终在发生这种情况之前停止。在这种情况下,改变<=<

for (int i = 0; i <= password.Length - 1; i += 2) 

编辑我添加了一个对证password.Length - 1因为你还可以访问password[i + 1],这将可能同样的问题

这也可能是有益的添加一些检查,并确保password有一个偶数字符,或者你可能会遇到同样的问题,因为你正在增加2.

+0

非常感谢你的回复,它解决了我的问题 btw密码总是会有偶数个字符因为无论原始密码多长时间,加密的密码都会有2x多个字符,每个数字x2会给出一个偶数。所以现在一切正常 – Leko 2015-04-01 13:12:29

1

只是冒险猜测我会认为你的for循环每次前进2个字符将成为引发索引异常的主要嫌疑犯,因为它会超过字符串的末尾。

写入它的方式甚至可能发生,无论密码长度如何。因此,如果您的密码长度为6,您将检查索引0 & 1,然后2 & 3,然后4 & 5.此时环路表示5是< = 6,因此也可以检查索引6 & 7,但由于您的密码长度为6,您的最高索引为5,因此您会得到一个“BOOM” - 由于索引超出范围而导致异常。

同时,如果你的密码长度是5,将检查指标对0 & 1,2 & 3,然后在4 & 5,你会再次炸毁因为指数5太大的长度为5的密码因为它的最高指数是4.

我认为这可能是您的问题的原因。

最重要的是,密码长度属性从1开始计数,而您的索引(因此您的循环计数器)是基于0的。因此,当密码长度为6时,您要检查索引0,1,2,3,4,& 5,但是您的代码被写入检查索引0,1,2,3,4,5,& 6(至少每次都太远)。

我强烈建议创建一个函数,其唯一目的是获取一个长度为偶数的字符串,然后返回该字符串的加密版本。这可能只是因为你的固定环比较为长度1那样简单:

string target; 
text = ""; 
password = richTextBox2.Text; 
for (int i = 0; i <= password.Length - 1; i += 2) 
{ 
    target = Convert.ToString(password[i]) + Convert.ToString(password[i + 1]); 
    if (target == ",,") 
    { 
     text += "a"; 
    } 
} 
richTextBox3.Text = text; 

为了使之成为所有字符串的工作,虽然你将需要拿出奇数长度字符串的战略。您可能需要以不同的方式加密第一个或最后一个字符,或者在密码的前面或后面追加空白字符,或者加密算法适用的任何内容。只要你找到一种方法来采取奇怪的长度的字符串,使他们甚至让你像对待他们甚至。

1

你遇到了一个错误的错误。索引通常是基于零的,这意味着第一项是[0],第二项是[1],依此类推。您尝试访问[10]的字符串长度为10会给您一个例外,因为最后一个元素实际上是[9]。因此,您的条件需要使用<而不是<=,以便它永远不会超过最后一个元素索引。

+0

此外,你可能实际上想使用'我 planetarian 2015-03-31 21:05:36