C#不使用LINQ实现字符大小写互换出现索引越界错误如何解决
异常触发原因
- 外层循环边界判断错误:C# 数组索引范围为
0到数组长度 - 1,你的代码中a = convert.Length,外层循环判断写为b <= a,当b等于a时访问convert[b]已经超出数组边界。 - 内层循环缺少边界校验:所有嵌套的while循环仅判断了字符类型,未校验
b < convert.Length,当b自增到数组长度后,后续访问convert[b]会直接触发越界。
其他逻辑错误
你的代码即使修复越界问题也无法得到正确转换结果:
char.ToLower()/char.ToUpper()是返回新字符的纯方法,不会修改原数组中的值,你没有将转换结果赋值回convert[b],原数组不会发生任何变化。- 小写字符的处理分支错误调用了
char.ToLower(),大小写互换需要改为调用char.ToUpper()。
修复后的代码(基于原逻辑调整)
string text2 = "HELLO my friEND"; char[] convert = text2.ToCharArray(); int b = 0; int a = convert.Length; // 修正外层循环条件 while (b < a) { // 所有内层循环增加边界判断 while (b < a && char.IsUpper(convert[b])) { // 将转换结果赋值回数组 convert[b] = char.ToLower(convert[b]); b++; } while (b < a && char.IsLower(convert[b])) { // 修正为转大写逻辑 convert[b] = char.ToUpper(convert[b]); b++; } while (b < a && char.IsWhiteSpace(convert[b])) { b++; } } string hello = new string(convert); Console.WriteLine(hello); // 输出:hello MY FRIend
更简洁的实现方案
不需要嵌套多层while循环,使用单循环遍历每个字符单独处理即可,逻辑更清晰,出错概率更低:
string text2 = "HELLO my friEND"; char[] charArr = text2.ToCharArray(); for (int i = 0; i < charArr.Length; i++) { if (char.IsUpper(charArr[i])) { charArr[i] = char.ToLower(charArr[i]); } else if (char.IsLower(charArr[i])) { charArr[i] = char.ToUpper(charArr[i]); } // 非字母字符直接保留 } string result = new string(charArr); Console.WriteLine(result);
内容的提问来源于stack exchange,提问作者CallumStanbury
相关产品推荐
相关产品推荐

