C#数组赋值异常:仅最后一次输入为首个元素,其余元素为0
问题分析
你遇到的核心问题:
InputArray方法每次调用时会把整个数组的所有元素都赋值为当前输入内容,而main里循环调用该方法的次数等于数组长度,导致每次调用都会覆盖之前的数组内容。- 方法内的
k变量始终为0且未递增,加上goto滥用,让输入和赋值逻辑完全混乱,最终出现数组仅保留最后一次输入、其余元素异常的情况。
代码错误点拆解
- main方法调用错误:循环传入整个数组调用
InputArray,导致每次调用都修改全数组,而非逐个填充元素。 - 数组赋值逻辑错误:
end标签下的for循环遍历全数组,把所有元素设为当前input,完全覆盖之前输入。 - 无效字符判断:
char.TryParse的判断条件(c1 < -1) && (c1 > 11)不成立(char取值范围是0-65535,无负数),该分支无实际作用。 - 冗余类型解析:
double.TryParse成功时,int.TryParse判断多余,整数可直接解析为double。 - 索引变量未递增:
k初始为0且从未修改,导致每次调用方法都会重复触发输入逻辑。
修正后的代码
修正后的InputArray方法
private static void InputArray(double[] numbers) { for (int i = 0; i < numbers.Length; i++) { double inputValue; Console.Write($"Enter number {i + 1}: "); while (true) { string input = Console.ReadLine(); // 尝试解析为double if (double.TryParse(input, out inputValue)) { // 验证范围 if (inputValue >= 0 && inputValue <= 100) { numbers[i] = inputValue; break; // 验证通过,处理下一个元素 } else { Console.WriteLine("输入超出有效范围(0-100),请重新输入:"); } } else { // 解析失败,提供结束输入选项 Console.WriteLine("输入不是有效的数字,是否结束输入?(Y/N)"); string confirm = Console.ReadLine().Trim().ToUpper(); if (confirm == "Y") { return; } else { Console.Write("请重新输入有效数字:"); } } } } Console.WriteLine("所有元素输入完成。"); }
修正后的main方法调用
// 假设number是已初始化的数组 InputArray(number);
修正说明
- 移除循环调用:让
InputArray一次性处理全数组输入,避免重复覆盖。 - 逐个填充元素:通过
for循环遍历数组索引,输入验证通过后直接赋值给当前索引元素。 - 替换goto为while循环:用清晰的循环结构处理输入重试,避免代码跳转混乱。
- 简化验证逻辑:去掉无效字符判断,统一用
double.TryParse处理数字解析,范围验证更简洁。 - 增加结束输入选项:输入无效时提供结束选择,逻辑更友好。
内容的提问来源于stack exchange,提问作者Slater
相关产品推荐
相关产品推荐

