C#读取CSV格式数字串求最大值时返回垃圾值问题排查
问题原因
- 字符转整数逻辑错误:
Convert.ToInt32(char)返回的是字符的ASCII编码值,比如字符'2'的ASCII码是50,'3'是51,这就是你输出里出现50、551这类异常值的核心原因,并不是你要的数值2、3。 - 遗漏最后一个数字的最大值比较:你只有在遍历到逗号的时候才会把当前解析的数字
q和最大值s做比较,CSV字符串最后一个数字后面没有逗号,所以永远不会参与最大值计算,最终结果也会出错。
修复方案
- 调整字符转数值的逻辑,用
input[i] - '0'获取字符对应的真实数值,或者用int.Parse(input[i].ToString())也可以。 - 循环结束后额外执行一次最大值比较,把最后一个解析完成的数字纳入计算。
- 可选补充:如果要兼容带空格的输入,可以把你注释掉的空格判断逻辑放开,同时增加非数字字符的校验逻辑避免报错。
修正后的代码
static void Main(string[] args) { var p = 0; int q = 0, s = 0; Console.WriteLine("Enter the numbers seperated by comma"); var input = Console.ReadLine(); // 增加空输入判断避免报错 if(string.IsNullOrEmpty(input)) { Console.WriteLine("输入为空"); return; } for (var i = 0; i < input.Length; i++) { if (input[i] == ',') { p = 0; s = (s > q) ? s : q; } else if (input[i] == ' ') { p = 0; continue; } else { // 修正字符转数字的逻辑 int num = input[i] - '0'; q = (p == 1) ? q * 10 + num : num; Console.WriteLine(q); p = 1; } } // 循环结束后补一次最后一个数字的比较 s = (s > q) ? s : q; Console.WriteLine($"最大值是:{s}"); }
更简洁的实现方案
如果不需要手动实现字符解析逻辑,可以直接用字符串分割的方法,代码更简洁易维护,也不容易出逻辑错误:
static void Main(string[] args) { Console.WriteLine("Enter the numbers seperated by comma"); var input = Console.ReadLine(); if(string.IsNullOrEmpty(input)) { Console.WriteLine("输入为空"); return; } int max = input.Split(',') .Select(x => int.Parse(x.Trim())) .Max(); Console.WriteLine($"最大值是:{max}"); }
内容的提问来源于stack exchange,提问作者pffft
相关产品推荐
相关产品推荐

