C#局部变量不会在if语句中变异

时间:2018-09-17 13:58:06

标签: c#

我是C#的新手,我用谷歌搜索了答案。我找到的最接近的答案是这个one。但这对我没有帮助。

我正在尝试编写一个仅使用循环和拼接在字符串中找到最大数字的函数。由于某种原因,当条件满足时,局部变量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));
            }

        }
    }
}

3 个答案:

答案 0 :(得分:3)

问题出在您对以下语句的检查中:

else if (uinput[i].Equals(" "))

uinput [i]是一个字符,而“”是一个字符串:see this example

如果您将双引号替换为单引号,it works fine ...

else if (uinput[i].Equals(' '))

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

  • 在循环后再次检查con1的值(看起来不太好)
  • 重写您的方法,因为您有些过分了,不要重蹈覆辙。您可以执行类似操作(使用System.Linq):

    public int BiggestNumberInString(string input)
    {
        return input.Split(null).Max(x => int.Parse(x));
    }
    

    仅在确定输入内容时

答案 1 :(得分:1)

当您在键盘上输入数字和空格时,您只会读取数字,而没有空格。 因此,您拥有uinput="34"。 在循环内部,仅当m > big时检查uinput[i].Equals(" ")是否有效。从来没有。 通常,如果您读一行,数字后跟空格,它将忽略最后一个数字。

一种解决方案是在uinput后面添加一个“”,但我建议进行拼接。

string[] numbers = uinput.Split(null);

然后遍历数组。

另外,如另一个答案中所述,比较uinput[i].Equals(' ')是因为" "代表一个字符串,并且您正在将char与一个字符串进行比较。

答案 2 :(得分:0)

正如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();
}