似乎除了垃圾价值什么都得不到

cant seem to get anything but garbage value

代码以 csv("23,25,27) 的形式获取 sting 中的输入,然后找到它们的最高值 27(类型 int)全部。但是 q 似乎 return 垃圾值每次。

static void Main(string[] args)
{
        var p=0;`enter code here`
        int q=0,r,s=0;
        Console.WriteLine("Enter the numbers seperated by comma");
        var input = Console.ReadLine();
        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
            {
                q = (p == 1) ? q * 10 + Convert.ToInt32(input[i]) : Convert.ToInt32(input[i]);
                Console.WriteLine(q);
                p = 1;
            }
        
        }
        
        Console.WriteLine(s);
    }

输出: 输入以逗号分隔的数字 23,27 50 551 50 555 551

你的问题是在执行循环时。您需要在执行 for 循环之前拆分输入。

// Perform split of the input using ',' as delimiter
var splitstring = input.Split(',');
// iniate max value
var maxval = 0;
// perform foreach loop (similar to for loop but easier to read especially when want to read all the content in an array)
foreach (var x in splitstring)
{
   var y = int.Parse(x);
   if (y > maxval) maxval = y;
}
// Print the final maxval
Console.WriteLine(maxval);

可能有语法错误,但逻辑应该在那里。

与其使用 pqs,不如将这些变量分别重命名为 hasSeenAtLeastOneDigitparsedcurrentHighest ,这是更具描述性的名称。另请注意,hasSeenAtLeastOneDigit 应该是 bool,并且 r 未在任何地方使用。

var hasSeenAtLeastOneDigit = false;
int parsed=0,currentHighest = 0;
Console.WriteLine("Enter the numbers seperated by comma");
var input = Console.ReadLine();
for (var i = 0; i < input.Length; i++)
{
    if (input[i] == ',')
    {
        hasSeenAtLeastOneDigit = false;
        currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
    }
    else
    {
        parsed = hasSeenAtLeastOneDigit ? parsed * 10 + Convert.ToInt32(input[i]) : Convert.ToInt32(input[i]);
        // Console.WriteLine(parsed);
        hasSeenAtLeastOneDigit = true;
    }

}

Console.WriteLine(currentHighest);

你这里有 2 个错误。首先,为了安全起见,你不小心用了this overload of ToInt32 that takes a char, which converts a char to its UTF-16 code unit value, not the digit that it represents. You should have used the overload that takes a string or int.TryParse

Convert.ToInt32(input[i].ToString())
//                      ^^^^^^^^^^^
//         converts to string, so the string overload is used

第二个错误是您没有将最后解析的值与 currentHighest 进行比较。考虑输入为 1,2,3,4 的情况。循环结束后,parsed 将变为 4,而 currentHighest 将变为 3,这是不正确的。发生这种情况是因为 运行 这一行的末尾没有尾随逗号:

currentHighest = (currentHighest > parsed) ? currentHighest : parsed;

您只需在循环末尾复制并粘贴该行即可解决此问题。

var hasSeenAtLeastOneDigit=false;
int parsed=0,currentHighest=0;
Console.WriteLine("Enter the numbers seperated by comma");
var input = Console.ReadLine();
for (var i = 0; i < input.Length; i++)
{
    if (input[i] == ',')
    {
        hasSeenAtLeastOneDigit = false;
        currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
    }
    else
    {
        parsed = hasSeenAtLeastOneDigit ? parsed * 10 + Convert.ToInt32(input[i].ToString()) : Convert.ToInt32(input[i].ToString());
        hasSeenAtLeastOneDigit = true;
    }

}
currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
Console.WriteLine(currentHighest);

另请注意,整个算法可以像这样使用 LINQ 完成:

var input = Console.ReadLine();
var highest = input.Split(',').Select(int.Parse).Max();
Console.WriteLine(highest);