You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台输入验证:输入Q无法触发程序退出的问题排查

问题说明

实现C#控制台程序输入验证时,要求任意一次Console.ReadLine()交互环节用户输入Q,程序立即退出,现有代码无法实现该效果,故障代码如下:

using System;

namespace SummerWorkTask1
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName;
            string surname;
            string dateOfBirth;

            do
            {
                Console.WriteLine("Please enter your frist name and if at anytime you want to quit enter Q\n");
                firstName = Console.ReadLine().ToUpper();
                Console.WriteLine("Now enter your surname\n");
                surname = Console.ReadLine().ToUpper();
                Console.WriteLine("Lastly, enter your date of birth in the format of DD/MM/YY \n");
                dateOfBirth = Console.ReadLine().ToUpper();

                string customerID = $"{dateOfBirth.Replace("/", "")}{surname.Substring(0, 3)}{firstName.Substring(0, 1)}{firstName.Length} ";
                Console.WriteLine(customerID);
            } while (!firstName.Equals("Q") || !surname.Equals("Q") || !dateOfBirth.Equals("Q"));
        }
    }
}
故障原因

代码存在三类问题,导致无法满足需求:

  • 退出判断时机错误:所有输入读取完成后才做退出校验,用户在输入名字、姓氏任意环节输入Q时,程序不会立刻终止,仍会继续提示后续输入、执行ID生成逻辑,完全不符合「输入Q立即退出」的要求。
  • 循环条件逻辑错误:循环判断使用了||或运算符,逻辑等价于「只要三个输入中存在不是Q的值,就继续循环」,哪怕用户某一步输入了Q,只要另外两个值不是Q,循环就不会终止。
  • 隐藏异常风险:未处理ReadLine()返回null的场景(比如用户输入Ctrl+Z),也未判断输入字符串长度,当姓氏长度不足3位、名字为空时,调用Substring()会直接抛出运行时异常。
修复方案

调整逻辑为每一次读取用户输入后立刻校验是否为Q,命中则直接退出程序,同时补充边界异常处理,修复后代码如下:

using System;

namespace SummerWorkTask1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Please enter your first name, enter Q at any time to quit\n");
                string firstName = Console.ReadLine()?.Trim().ToUpper();
                // 即时判断退出指令
                if (firstName == "Q")
                {
                    Console.WriteLine("Program exit.");
                    return;
                }
                // 校验输入非空
                while (string.IsNullOrWhiteSpace(firstName))
                {
                    Console.WriteLine("Invalid input, first name cannot be empty. Enter Q to quit, or re-enter first name:\n");
                    firstName = Console.ReadLine()?.Trim().ToUpper();
                    if (firstName == "Q")
                    {
                        Console.WriteLine("Program exit.");
                        return;
                    }
                }

                Console.WriteLine("Now enter your surname\n");
                string surname = Console.ReadLine()?.Trim().ToUpper();
                if (surname == "Q")
                {
                    Console.WriteLine("Program exit.");
                    return;
                }
                while (string.IsNullOrWhiteSpace(surname))
                {
                    Console.WriteLine("Invalid input, surname cannot be empty. Enter Q to quit, or re-enter surname:\n");
                    surname = Console.ReadLine()?.Trim().ToUpper();
                    if (surname == "Q")
                    {
                        Console.WriteLine("Program exit.");
                        return;
                    }
                }

                Console.WriteLine("Lastly, enter your date of birth in the format of DD/MM/YY \n");
                string dateOfBirth = Console.ReadLine()?.Trim().ToUpper();
                if (dateOfBirth == "Q")
                {
                    Console.WriteLine("Program exit.");
                    return;
                }
                // 兼容短姓氏场景,避免Substring抛异常
                string processedSurname = surname.PadRight(3, 'X').Substring(0, 3);
                string customerID = $"{dateOfBirth.Replace("/", "")}{processedSurname}{firstName[0]}{firstName.Length}";
                Console.WriteLine($"Generated customer ID: {customerID}\n");
            }
        }
    }
}
关键修改点
  • 每一次读取输入后立刻判断是否为Q,命中则直接终止程序,实现任意环节即时退出的需求。
  • 移除原do-while循环末尾的错误判断逻辑,改用死循环+即时return的控制流,避免逻辑运算符误用导致的判断失效。
  • 增加空值防护:使用?.运算符处理ReadLine()返回null的场景,避免空引用异常。
  • 增加输入合法性校验:对空输入做重输提示,同时用PadRight补全长度不足3位的姓氏,避免字符串截取时抛出长度不足异常。
  • 修正了原提示文本中的拼写错误(将frist name改为first name)。

内容的提问来源于stack exchange,提问作者Elliot Freebairn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:09:18