C# 如何检查用户输入

本文关键字:用户 输入 检查 何检查 | 更新日期: 2023-09-27 18:33:55

我有一个允许字符的字符串。我希望该用户只能使用此字符。我的想法是遍历 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);
    }
}

C# 如何检查用户输入

如果要

检查用户输入是否包含任何不允许的字符,则需要嵌套循环,因为要将用户输入中的每个字符与允许的字符进行比较:

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);
}

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

搜索方法:

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);

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

第一个循环中需要另一个循环:

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# 或编程,所以我提供了一个基本答案(希望(帮助您了解当前不适用于您的代码的内容。

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

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

使用集合存储不允许的项(而不是纯字符串(时,它会打开一个全新的 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);
        }
    }