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

C#读取CSV格式数字串求最大值时返回垃圾值问题排查

问题原因
  • 字符转整数逻辑错误:Convert.ToInt32(char)返回的是字符的ASCII编码值,比如字符'2'的ASCII码是50,'3'是51,这就是你输出里出现50、551这类异常值的核心原因,并不是你要的数值2、3。
  • 遗漏最后一个数字的最大值比较:你只有在遍历到逗号的时候才会把当前解析的数字q和最大值s做比较,CSV字符串最后一个数字后面没有逗号,所以永远不会参与最大值计算,最终结果也会出错。
修复方案
  1. 调整字符转数值的逻辑,用input[i] - '0'获取字符对应的真实数值,或者用int.Parse(input[i].ToString())也可以。
  2. 循环结束后额外执行一次最大值比较,把最后一个解析完成的数字纳入计算。
  3. 可选补充:如果要兼容带空格的输入,可以把你注释掉的空格判断逻辑放开,同时增加非数字字符的校验逻辑避免报错。
修正后的代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:05