【问题标题】:Read a string, separate it, and put it into an array C#读取一个字符串,将其分隔,并将其放入数组 C#
【发布时间】:2013-11-21 04:56:40
【问题描述】:

我正在尝试通过用户输入读取字符串并将其存储在数组中。字符串必须是由空格分隔的单个数字。用户将准确输入 20 个数字,并且任何数字都不能连续出现两次。

示例字符串:

1 2 9 6 3 2 4 5 8 1 3 6 4 7 8 2 1 9 6 3

这是我必须执行此操作的代码,以及错误检查,但它无法正常工作。我想我对错误检查的想法太过分了。 refString 是下面代码中大小为 20 的 int 数组。

case 2:
bool validated = false;
Console.WriteLine("\nPlease enter a 20 character reference string, each separated by a single space");
Console.WriteLine("A number should not occur twice in a row, ex: 1 5 4 4 6");
Console.WriteLine("Each character must be an integer 1-9");
Console.WriteLine("Example reference string:  1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6");
Console.WriteLine("\nEnter reference string:  ");
string s = Console.ReadLine();
refString = s.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();  //split string and add numbers into array
int totalCount = refString.Length;

//if the user entered exactly 20 numbers, check to see if any of the numbers occur twice in a row
if (totalCount == 20)
{
    for (i = 1; i < 20; i++)
    {
        while (refString[i] == refString[i - 1])    //make sure two of the same number side by side do not occur
        {
            break;
        }

    }
}

while (totalCount != 20 || !validated)
{
    for (i = 1; i < 20; i++)
    {
        while (refString[i] == refString[i - 1])    //make sure two of the same number side by side do not occur
        {
            Console.WriteLine("\nError: reference string is NOT 20 numbers");
            Console.WriteLine("\nEnter reference string:  ");
            s = Console.ReadLine();
            refString = s.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();
            totalCount = refString.Length;
        }
    }
    if (totalCount == 20)
    {
        for (i = 1; i < 20; i++)
        {
            while (refString[i] == refString[i - 1])    //make sure two of the same number side by side do not occur
            {
                break;
            }
        }
    }

}

break;
}

【问题讨论】:

    标签: c# arrays split


    【解决方案1】:

    尝试类似:

    case 2:
        bool correctNumber = true;
        bool repeats = false;
        Console.WriteLine("\nPlease enter a 20 character reference string, each seperated by a single space");
        Console.WriteLine("A number should not occur twice in a row, ex: 1 5 4 4 6");
        Console.WriteLine("Each character must be an integer 1-9");
        Console.WriteLine("Example reference string:  1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6");
        Console.WriteLine("\nEnter reference string:  ");
        string s = Console.ReadLine();
        refString = s.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();  //split string and add numbers into array
        correctNumber = refString.Length == 20;
    
        if (correctNumber)
        {
            for (i = 1; i < 20; i++)
            {
                if(refString[i] == refString[i - 1])
                {
                    repeats = true;
                    break;
                }
            }
        }
        else
        {
            Console.WriteLine("Error: reference string is NOT 20 numbers");
        }
        if (repeats)
        {
            Console.WriteLine("Error: reference string contains repeated numbers");
        }
    
        break;
    

    这将检查两个失败条件并输出相关消息。

    【讨论】:

    • 感谢您的回复。我能够让它工作并完成大多数错误检查。我唯一没有为错误处理做的事情是防止错误输入,例如用户输入字母以及用户输入两位数。你介意解释一下怎么做吗?是NaN?
    【解决方案2】:

    您可以使用正则表达式检查是否有两个连续的重复数字

    if(!Regex.IsMatch(n,@".*(\d) \1.*"))
        s.Split(" ").Select(x=>int.Parse(x));
    

    【讨论】:

      【解决方案3】:
      bool correct = false;
      while(!correct){
          // ask for numbers until correct
          Console.WriteLine("\nEnter reference string:  ");
          string s = Console.ReadLine();
          refString = s.Split(' ').Select(n => Convert.ToInt32(n)).ToArray();
          int totalCount = refString.Length;
      
          // check    
          if (totalCount == 20) {
              correct = true;
              for (i = 1; i < refString.Length; i++) {
                  if(refString[i] == refString[i - 1]) {
                      // consecutive number
                      Console.WrinteLine("Error: same consecutive number "+refString[i]);
                      correct = false;
                      break;
                  }
              }
          }else{
              Console.WrinteLine("Error: not 20 elements");
          }
      }
      

      【讨论】:

      • 感谢您的回答!
      【解决方案4】:

      您可以做的一个技巧是使用 Linq 过滤掉所有错误值,然后检查计数是否低于 20:

      var listOfInts = stringTest.Split(' ').Select(n => Convert.ToInt32(n)).ToList();
      
      // filter ints with adjacent values and out of range
      var count =
          listOfInts.Where((i, j) => (j + 1 == listOfInts.Count || // adjacent values
                                      i != listOfInts[j + 1]) 
                                      && i > 0 && i < 10) // out of range
                    .Count(); // total
      

      如果 count

      【讨论】:

        猜你喜欢
        • 2018-05-18
        • 2020-08-26
        • 1970-01-01
        • 2015-04-03
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        相关资源
        最近更新 更多