C#局部变量won';if语句中的t变异

C#局部变量won';if语句中的t变异,c#,C#,我对C#相当陌生,我已经用谷歌搜索了答案。我找到的最接近的答案是这个。但这对我没有帮助 我正在尝试编写一个函数,只使用循环和拼接来查找字符串中的最大数字。出于某种原因,当满足条件时,局部变量big不会在if语句中发生变异。我曾经尝试过在遇到空格时设置big=34来调试它,但即使这样,它也不会改变局部变量 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste

我对C#相当陌生,我已经用谷歌搜索了答案。我找到的最接近的答案是这个。但这对我没有帮助

我正在尝试编写一个函数,只使用循环和拼接来查找字符串中的最大数字。出于某种原因,当满足条件时,局部变量big不会在if语句中发生变异。我曾经尝试过在遇到空格时设置big=34来调试它,但即使这样,它也不会改变局部变量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace parser
{
    class Sub_parser
    {
        // function to find the greatest number in a string
        public int Greatest(string uinput)
        {
            int len = uinput.Length;
            string con1 = "";
            int big = 0;
            int m = 0;

            // looping through the string
            for (int i = 0; i < len; i++)
            {
                // find all the numbers
                if (char.IsDigit(uinput[i]))
                {
                    con1 = con1 + uinput[i];
                }

                // if we hit a space then we check the number value
                else if (uinput[i].Equals(" ")) 
                {
                    if (con1 != "")
                    {
                        m = int.Parse(con1);
                        Console.WriteLine(m);
                        if (m > big)
                        {
                            big = m;
                        }
                    }

                    con1 = "";

                }

            }

            return big;
        }
        public static void Main(string[] args)
        {
            while (true)
            {
                string u_input = Console.ReadLine();
                Sub_parser sp = new Sub_parser();
                Console.WriteLine(sp.Greatest(u_input));
            }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间分析器
{
类子语法分析器
{
//函数查找字符串中的最大数
公共整数最大(字符串输入)
{
int len=输入长度;
字符串con1=“”;
int大=0;
int m=0;
//在字符串中循环
对于(int i=0;i大)
{
大=m;
}
}
con1=“”;
}
}
回归大;
}
公共静态void Main(字符串[]args)
{
while(true)
{
字符串u_input=Console.ReadLine();
Sub_parser sp=新的Sub_parser();
控制台写入线(sp.max(u_输入));
}
}
}
}

问题来自您在本声明中的检查:

else if (uinput[i].Equals(" "))
uinput[i]是字符,而“”是字符串:

如果用单引号替换双引号

并且,如注释所述,最后一个数字永远不会被检查,除非输入字符串以空格结尾。这给您留下了两个选择:

  • 再次检查循环后con1的值(不太好看)
  • 重写你的方法,因为你做得有点过火,不要重新发明轮子。您可以执行以下操作(使用System.Linq):

    只有当你确信你的意见时


当你在键盘上输入一个数字和一个空格时,你只读取数字,没有空格。 因此您有了
uinput=“34”
。 在循环内部,仅当
uinput[i].等于(“”
)时,才检查
m>是否大。这从来都不是。
一般来说,如果你读一行,数字后面跟空格,它会忽略最后一个数字

一种解决方案是在uinput中附加一个“”,但我建议使用拼接

string[] numbers = uinput.Split(null);
然后迭代数组


另外,正如在另一个答案中所说,compare
uinput[i].Equals(“”)
,因为
表示一个字符串,而您正在将一个字符与一个字符串进行比较。

正如Martin Verjans所提到的,为了使代码正常工作,您必须像在他的示例中那样对其进行编辑。 虽然如果您输入一个数字仍然存在问题。然后,输出将为0

我会选择这种方法:

public static int Greatest(string uinput)
{
    List<int> numbers = new List<int>();
    foreach(string str in uinput.Split(' '))
    {
        numbers.Add(int.Parse(str));
    }

    return numbers.Max();
}
公共静态整数最大值(字符串输入)
{
列表编号=新列表();
foreach(uinput.Split(“”)中的字符串str)
{
添加(int.Parse(str));
}
返回数字。Max();
}

输入看起来如何?设置断点并使用调试器逐步检查代码和变量。变量在
if()
语句中会发生变异。问题是您将所有数字追加到同一个字符串中,因此对于输入
12
2
将与
12
进行比较,因此不会变大。局部变量没有问题。如果你认为它们的值没有改变,那就意味着代码中有一个bug。但是,您没有解释您所谈论的变量。你试过调试你的代码吗?也许条件是错误的,执行从未进入修改该变量的块?@PanagiotisKanavos OP说,
big
变量是一个没有改变的变量。“我试图通过设置big=34来调试它”-这不是真正的调试,主要是猜测和假设。调试将涉及设置一个断点,然后一次一个操作地逐步完成功能,并观察运行时值和行为。在程序执行过程中的某个时刻,特定操作将出现意外结果。调试时发生的第一件意外事情是什么?该操作的输入是什么?结果如何?预期的结果是什么?为什么?我知道最后一个号码不会被检查。这只是一项正在进行的工作。我一直在测试输入“我有32只羊”谢谢。我不敢相信答案竟如此简单!我知道您可以使用split方法来实现这一点,我曾试图通过故意使用循环来学习语法。@jun下次,请不要忘记提及您正在尝试的输入字符串示例。你的问题可能会被社区关闭。
string[] numbers = uinput.Split(null);
public static int Greatest(string uinput)
{
    List<int> numbers = new List<int>();
    foreach(string str in uinput.Split(' '))
    {
        numbers.Add(int.Parse(str));
    }

    return numbers.Max();
}