实时捕获用户输入错误

时间:2018-06-29 12:40:42

标签: c# .net error-handling user-input

我制作了这个简单的控制台应用程序,要求用户输入用户名和密码。 然后将数据保存在Db中。对于Db中的每一列,我为数据类型分配了数量有限的值。例如,密码(varchar(5)必须最多包含5个字符。

using System;

namespace MyConto
{
    public class NewUser
    {
        public static void NewUserRegistration()
        {
            Console.Write("Username: ");
            string user = Console.ReadLine();

            Console.Write("Password: ");
            string pass = Console.ReadLine();     
        }
    }
}

现在,我如何实时检查用户在控制台中写的内容?可能吗? 例如,一条消息警告用户,如果用户将"password"写为密码,则字符串太长。

谢谢

4 个答案:

答案 0 :(得分:2)

添加类似的验证方法:

private bool isValid(string input)
{
   //my validation logic
}

并像这样使用:

  ...
string user = Console.ReadLine();
if (!isValid(user))
{
    ///my logic for warning the user that input is invalid
}
...

答案 1 :(得分:1)

如果您要一直询问用户直到提供有效密码,您可以执行以下操作:

string ObtainPassword()
{
    string password;
    string passwordErrorMessage;
    while(true)
    {
        Console.Write("Password: ");
        password = Console.ReadLine();
        passwordErrorMessage = ValidatePassword(password);
        if (passwordErrorMessage == null)
            return password;

        Console.WriteLine($"\r\n*** {passwordErrorMessage}");
    }
}

密码验证方法如下:

string ValidatePassword(string password)
{
    if(password.Length > 5) return "Password is too long";

    //Add other validations here as needed

    return null;
}

答案 2 :(得分:1)

我认为“实时”是指您希望用户在看到消息之前先按ENTER键-因此,只要他们输入第6个字符,它就会告诉他们太长。您不能使用Console.ReadLine()来执行此操作,而可以可以使用Console.ReadKey()来执行此操作,尽管这需要很多努力……但仅仅是为了好玩:

class Program
{
    static void Main(string[] args)
    {
        //First clear the screen.  We need to have absolute knowledge of what's on 
        //the screen for this to work.
        Console.Clear();
        //hide the cursor as it has no real bearing on much....
        Console.CursorVisible = false;
        var user = GetLimitedInput("UserName?", 0, 10, true);
        var password = GetLimitedInput("Password?", 4, 5, false);

        Console.Clear();
        Console.WriteLine($"User is {user} and password is {password}");
    }


    private static string GetLimitedInput(string prompt, 
        int lineToShowPromptOn, int maxChars, bool showChars)
    {
        //set cursor to the suggested position
        Console.SetCursorPosition(0, lineToShowPromptOn);
        //output the prompt.
        Console.WriteLine(prompt);
        Console.SetCursorPosition(0, lineToShowPromptOn + 1);

        var finished = false;
        var inputText = string.Empty;

        while (!finished)
        {
            if (Console.KeyAvailable)
            {
                //remembr old input so we can re-display if required.
                var oldInput = inputText;
                var key = Console.ReadKey();
                //check for CTRL+C to quit
                if (key.Modifiers.HasFlag(ConsoleModifiers.Control) && key.KeyChar=='c')
                {
                    inputText = string.Empty;
                    finished = true;
                }
                //allow backspace
                else if (key.KeyChar == '\b')
                {
                    if (inputText.Length > 0)
                    {
                        inputText = inputText.Substring(0, inputText.Length - 1);
                    }
                }
                //check for return & finish if legal input.
                else if (key.KeyChar == '\r')
                {
                    if (inputText.Length<=maxChars)
                    {
                        finished = true;
                    }
                }
                else
                {
                    //really we should check for other modifier keys (CTRL, 
                    //ALT, etc) but this is just example.
                    //Add text onto the input Text
                    inputText += key.KeyChar;
                }

                if (inputText.Length > maxChars)
                {
                    //Display error on line under current input.
                    Console.SetCursorPosition(0, lineToShowPromptOn + 2);
                    Console.WriteLine("Too many characters!");
                }
                else
                {
                    //if not currently in an 'error' state, make sure we
                    //clear any previous error.
                    Console.SetCursorPosition(0, lineToShowPromptOn + 2);
                    Console.WriteLine("                     ");
                }
                //if input has changed, then refresh display of input.
                if (inputText != oldInput)
                {
                    Console.SetCursorPosition(0, lineToShowPromptOn + 1);
                    //do we show the input?
                    if (showChars)
                    {
                        //We write it out to look like we're typing, and add 
                        //a bunch of spaces as otherwise old input may be        
                        //left there.
                        Console.WriteLine(inputText+"            ");
                    }
                    else
                    {
                        //show asterisks up to length of input.
                        Console.WriteLine(new String('*', inputText.Length)+"            ");
                    }

                }

            }
        }

        return inputText;
    }       
}

注意:这有很多缺陷,但这只是出于说明目的:)

答案 3 :(得分:0)

我最终得到了这个

using System;

namespace MyConto
{
    public class NewUser
    {
        public static void NewUserRegistration()
        {
            Console.Write("Username: ");
            string user = Console.ReadLine();

            Console.Write("Password: ");
            string pass = Console.ReadLine();
            while (pass.Length > 5)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Insert a valid password (max 5 chars)\n");
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("Password: ");
                pass= Console.ReadLine();
            }     
        }
    }
}