You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段C#代码会抛出“索引超出数组范围”错误?

为啥这段代码会抛出“索引超出数组范围”错误?

嘿,这个问题我太懂了!咱们一步步拆解问题所在:

1. 最核心的错误:Split()方法用错了

你想用Split()把字符串拆成单个字符,但默认的Split()是按空白字符(空格、制表符等)分割字符串,不是拆成单个字符。比如你输入"ZhangSan",userName3.Split()得到的数组只有1个元素——就是整个字符串"ZhangSan"。这时候你去访问userNameArr[2]、userNameArr[4],数组根本没有这些索引,自然就报“索引超出数组范围”了。

要把字符串拆成单个字符,有两种更简单的方式:

  • 直接用字符串的索引器:C#里字符串本身就支持按索引取字符,比如userName3[0]就是第一个字符
  • 用ToCharArray()方法:把字符串转成字符数组,比如char[] userNameArr = userName3.ToCharArray();

2. 还有两个隐藏bug(虽然不是直接导致越界,但也得修)

循环里的赋值错误

while (greater = false)这里是赋值操作,不是比较!你每次循环都把greater设为false,就算用户输入了符合长度的字符串,也会陷入死循环。正确的写法应该是比较运算符==:while (greater == false),或者更简洁的while (!greater)。

长度不够时没有重新读取输入

原来的代码里,如果用户输入的字符串长度不够,只会提示错误,但不会让用户重新输入,加上上面的赋值错误,直接就死循环了。得在else块里加上userName3 = Console.ReadLine();,让用户重新输入。

修正后的代码示例

bool isValid = false;
Console.WriteLine("请输入您的姓名:");
string userName3 = Console.ReadLine();
while (!isValid) {
    if (!string.IsNullOrEmpty(userName3) && userName3.Length >= 5) {
        isValid = true;
    } else {
        Console.WriteLine("姓名长度必须不少于5个字符,请重新输入:");
        userName3 = Console.ReadLine();
    }
}
// 直接通过字符串索引获取第1、3、5个字符(注意C#索引从0开始,所以对应0、2、4)
Console.WriteLine($"{userName3[0]} {userName3[2]} {userName3[4]}");

内容的提问来源于stack exchange,提问作者Jack Warren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:33:35