【问题标题】:C# how can I check users inputC#如何检查用户输入
【发布时间】:2014-12-11 04:51:53
【问题描述】:

我有一个带有允许字符的字符串。我希望该用户只能使用此字符。 我的想法是遍历 unser 输入字符串并将 char 与 char 进行比较。但是我遇到的问题是,当字符串中允许的第一个字符是“A”而用户输入的第一个字符是“B”时,它给了我一个错误......

现在一头雾水

string allowed = "abc";
string read= Console.ReadLine();

for (int i = 0; i < allowed.Length; i++ )
{
    if (allowed[i] == read[i])
    {
        Console.WriteLine("Okay");
    }
    else
    {
        Console.WriteLine("Invalid char on" +index);
    }
}

【问题讨论】:

  • if(allowed == read) 呢?
  • 所以你说我什至不需要循环?
  • 不,如果您只想在当前场景中比较字符串。您还可以查看 String.Equals 重载,它也提供不区分大小写的比较。
  • 不需要或不需要循环
  • @user3320668 你想检查用户输入是否与allowed 完全匹配,或者是否包含任何无效字符?

标签: c#


【解决方案1】:

如果您想检查用户输入是否有任何不允许的字符,您需要一个嵌套循环,因为您想将用户输入中的每个字符与允许的字符进行比较:

foreach(var r in read)
{
    bool isValid = false;
    foreach(var c in allowed)
    {
        // if we found a valid char set isValid to true
        if(c == r)
            isValid = true;
    }
    // if it's still false then the current char
    // doesn't match any of the allowed chars 
    // so it's invalid
    if(!isValid) 
    {
       Console.WriteLine("the string has invalid char(s)");
       break;
    }
}

或者,为了简化这一点,您可以使用 LINQ:

bool isInvalid = read.Any(c => !allowed.Contains(c));

如果想知道哪些字符无效,可以使用Except方法:

var invalidChars = read.Except(allowed);
foreach(var c in invalidChars)
{
    Console.WriteLine(c);
}

【讨论】:

  • 谢谢。它帮助了我很多。现在我知道我的第一个想法是正确的。我认为这永远不会与 if( c==r ) 一起使用。啊,伙计,我永远不会理解编程语言背后的逻辑......再次感谢伙计。
【解决方案2】:

您要么需要在允许的字符内搜索用户输入的字符,要么可以使用正则表达式。

搜索方法:

private string allowed = "abc";
private string userInput = "some string entered";

bool stringIsValid = false;
for (int i = 0; i < userInput.Length; i++)
{
    if (!allowed.IndexOf(userInput[i]))
    {
        stringIsValid = false;
        break; // You can stop the loop upon the first occurance of an invalid char
    }
}

正则表达式方法:

private string allowed = "abc";
private string userInput = "some string entered";

bool stringIsValid = Regex.IsMatch(allowed, userInput);

请注意,正则表达式方法更灵活。如果你学习了正则表达式,你会发现它非常强大。

【讨论】:

  • 感谢这个非常好的可视化解决方案。并感谢正则表达式的建议,去看看!
【解决方案3】:

您的第一个循环需要另一个循环:

string allowed = "abc";
string read= Console.ReadLine();

for (int i = 0; i < read.Length; i++ )
{
   bool isValid = false;
   for (int j = 0; j < allowed.Length; j++) 
   {
      if (read[i] == allowed[j])
      {
         isValid = true;
         break;
      }
   }
   if (isValid)
   {
    Console.WriteLine("Okay");
   }else{
    Console.WriteLine("Invalid char on" +index);
   }
}

现在,您所说的是“read 中的每个字符都必须与 allowed 中的完全相同”。 你想说的(我认为)是“read 中的每个字符都必须出现在allowed 的某个地方”——这就是第二个循环的作用。它在allowed 中查找字符,如果找到,则将isValid 设置为true。否则找不到字符,不正确。


正如此处的其他答案所述,您可以使用 LINQ 或(最好)正则表达式 (regex) 来处理此类问题。我认为这是家庭作业,或者您是 C# 或编程的新手,所以我提供了一个基本答案(希望)帮助您了解当前无法使用您的代码的内容。

如果这确实是一个家庭作业或学习相关的问题,那么我建议你下次把它放在你的问题中,因为不禁止询问家庭作业。

如果您想弄清楚基础知识,我们将使用的“现实世界”解决方案对您没有帮助,所以如果我们知道这是关于学习的东西,那么我们将提供对您更有用的答案。

【讨论】:

    【解决方案4】:

    当使用集合来存储不允许的项目(而不是纯字符串)时,它会打开一个全新的 LINQ 表达式范围,您可以使用:

        public static void Main(string[] args)
        {
            var allowed = new List<string> { "a", "b", "c" };
            var read = Console.ReadLine().Select(c => c.ToString()).ToList();
    
            if (read.All(allowed.Contains))
            {
                Console.WriteLine("Okay");
            }
            else
            {
                var firstNotAllowed = read.First(a => !allowed.Contains(a));
                var firstIndex = read.FindIndex(a => !allowed.Contains(a));
                Console.WriteLine("Invalid char: {0}, at index: {1}", firstNotAllowed, firstIndex);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多