【问题标题】:C# Crashing if no input for string Array如果字符串数组没有输入,C# 崩溃
【发布时间】:2012-04-06 05:59:15
【问题描述】:

我有一个包含 5 个值的字符串数组,我希望程序循环,即使我没有为数组输入值。如果我在不插入任何东西的情况下拆分数组(按.....(5次“。”拆分数组)那么它不会崩溃它只会循环。但是如果我只是按Enter键,那么程序就会崩溃。

有没有办法修复循环,即使没有输入,它也不会崩溃? (如果您没有完成所有 5 个值,它也会崩溃。)

Net = Console.ReadLine();
            string[] oktet = new string[5]; 
            oktet = Net.Split('.', '/'); 

            temp = oktet[0]; //inputs value of array in temp
            NaN = int.TryParse(temp, out Net0);
            temp = oktet[1];
            NaN = int.TryParse(temp, out Net1);
            temp = oktet[2];
            NaN = int.TryParse(temp, out Net2);
            temp = oktet[3];
            NaN = int.TryParse(temp, out Net3);
            temp = oktet[4];
            NaN = int.TryParse(temp, out subnet);
        }
        while (!NaN | Net0 > 255 | Net0 < 0 | Net1 > 255 | Net1 < 0 | Net2 > 255 | Net2 < 0 | Net3 > 255 | Net3 < 0 | subnet > 32 | subnet < 0);

我知道这很业余,但是嘿,我们是来学习的,对吧? :)

提前致谢!

【问题讨论】:

  • 我注意到它缺少一个 do{ 但那是因为我没有在我的复制/粘贴中得到它 ^^
  • 不要使用 NaN 等系统名称作为变量名。局部变量名也应该是 camelCase 而不是 PascalCase。 Net 也不是个好名字,改用 ipV4Address。
  • 另一个问题是你重新分配了NaN,所以while中的测试只会测试提取subnet的值是否有错误

标签: c# parameters string-parsing


【解决方案1】:

你可以尝试做这样的事情:

string[] oktet = Net.Split('.', '/'); // size array according to input

if (oktet.Length != 5) continue; // reloop on bad input

这两行代码替换了这些:

        string[] oktet = new string[5]; 
        oktet = Net.Split('.', '/'); 

【讨论】:

  • 谢谢,正是我需要的:)
【解决方案2】:

如果可以的话,我会使用一些命令行选项库(除非这是你需要学习如何验证输入、解析等的作业)。请参阅 NDesk.Options (http://www.ndesk.org/Options),也可通过 Nuget 获得。有关所需选项,请参阅以下内容:How to enforce required command-line options with NDesk.Options?

【讨论】:

    【解决方案3】:
    var userInput = Console.ReadLine();
    
    var userInputSplit = userInput.Split('.', '/');
    
    var numbers = userInputSplit.Select(word =>
        {
            int result;
            if (byte.TryParse(word, out result))
                return (byte?)result;
            return (byte?)null; });
        });
    
    var inputComplete = number.Where(number => number.HasValue).Count() == 4;
    

    【讨论】:

      【解决方案4】:

      问题在于您的变量 oktet 不是 5 的数组,因为您在其中分配了其他内容。

        string[] oktet = new string[5]; // Assigns an array of 5
        oktet = Net.Split('.', '/'); //assigns the result of the split to the variable
      

      所以,oktet 是拆分的结果,以及它的长度。

      顺便说一句,类以大写字母开头,变量应以小写字母开头。
      编码标准将使代码更具可读性,并帮助您区分项目。

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多