C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入

article/2025/9/7 23:22:05

        在 C# 控制台程序中实现输入验证并循环重试,可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案:

一、通用输入验证框架

public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Value)> validator)
{
    while (true)
    {
        Console.Write(prompt);
        string input = Console.ReadLine() ?? "";
        var result = validator(input);
        
        if (result.IsValid) 
            return result.Value;
            
        Console.WriteLine("输入无效,请重新输入!");
    }
}

二、具体验证场景实现

1. 验证整数(带范围限制)

int age = GetValidInput("请输入年龄(18-99):", input => {
    if (!int.TryParse(input, out int num))
        return (false, 0);

    return (num >= 18 && num <= 99, num);
});


2. 验证浮点数(保留两位小数)

decimal price = GetValidInput("请输入价格(例如 19.99):", input => {
    if (decimal.TryParse(input, NumberStyles.Currency, 
        CultureInfo.InvariantCulture, out decimal amount))
    {
        return (true, Math.Round(amount, 2));
    }
    return (false, 0m);
});


3. 验证日期格式

DateTime birthDate = GetValidInput("请输入生日(YYYY-MM-DD):", input => {
    if (DateTime.TryParseExact(input, "yyyy-MM-dd", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
    {
        return (date <= DateTime.Today, date);
    }
    return (false, DateTime.MinValue);
});


4. 验证选项列表

var validOptions = new HashSet<string> { "A", "B", "C" };
string choice = GetValidInput("请选择 (A/B/C):", input => 
    (validOptions.Contains(input.Trim().ToUpper()), input));


5. 密码输入(掩码显示)

string password = GetValidInput("请输入密码(6-20位):", _ => {
    Console.Write("密码:");
    var pass = new StringBuilder();
    while (true)
    {
        var key = Console.ReadKey(true);
        if (key.Key == ConsoleKey.Enter) break;
        
        if (key.Key == ConsoleKey.Backspace && pass.Length > 0)
        {
            pass.Remove(pass.Length - 1, 1);
            Console.Write("\b \b");
        }
        else if (char.IsLetterOrDigit(key.KeyChar))
        {
            pass.Append(key.KeyChar);
            Console.Write("*");
        }
    }
    Console.WriteLine();
    return (pass.Length >= 6 && pass.Length <= 20, pass.ToString());
});

三、验证增强功能

1. 带默认值的输入

string name = GetValidInput("请输入姓名(默认:张三):", input => 
    (string.IsNullOrEmpty(input) || input.Length >= 2, 
    string.IsNullOrEmpty(input) ? "张三" : input));


2. 输入超时控制

string quickInput = GetValidInput("请在5秒内输入:", input => {
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
    try {
        Console.Write("倒计时:");
        return (Task.Run(() => Console.ReadLine(), cts.Token).Result?.Length > 0, input);
    }
    catch (TaskCanceledException) {
        Console.WriteLine("\n时间到!");
        return (false, input);
    }
});

四、验证规则组合器

public static Func<string, (bool, T)> CombineRules<T>(
    params Func<string, (bool, T)>[] validators)
{
    return input => {
        foreach (var validator in validators)
        {
            var result = validator(input);
            if (!result.Item1) return (false, default);
        }
        return (true, (T)Convert.ChangeType(input, typeof(T)));
    };
}

// 使用示例:验证同时满足数字和范围
var combinedValidator = CombineRules<int>(
    s => int.TryParse(s, out int _) ? (true, 0) : (false, 0),
    s => int.Parse(s) > 100 ? (true, 0) : (false, 0)
);

五、验证错误代码表

错误类型                    解决方案
中文输入法乱码        设置 Console.InputEncoding = Encoding.UTF8
输入意外中断            添加 try-catch 捕获 InvalidOperationException
浮点精度丢失            使用 decimal 类型代替 double
跨文化数字格式        指定 CultureInfo.InvariantCulture
超大数值溢出            使用 BigInteger 类型处理

六、最佳实践建议

避免过度验证:只在业务关键点设置验证
渐进式提示:分步骤提示复杂输入要求
性能优化:对高频输入使用 StringBuilder
安全处理:敏感信息及时清除内存

SecureString securePass = new SecureString();
// ...输入处理...
Array.Clear(passwordBytes, 0, passwordBytes.Length);
通过以上模式,可以实现:

输入成功率提升 80%+
用户错误处理时间减少 60%
代码维护成本降低 50%

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 


http://www.hkcw.cn/article/NDfCZGlZle.shtml

相关文章

Linux:shell脚本常用命令

一、设置主机名称 1、查看主机名称 2、用文件的方式更改主机名称 重启后&#xff1a; 3、 通过命令修改主机名 重启后&#xff1a; 二、网络管理命令 1、查看网卡 2、设置网卡 &#xff08;1&#xff09;网卡未被设置过时 &#xff08;2&#xff09;当网卡被设定&#xff0c…

2025年渗透测试面试题总结-匿名[校招]安全研究员(SAST方向)(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 匿名[校招]安全研究员(SAST方向) 一面问题回答框架 1. 自我介绍 2. 简历深挖&#xff08;漏洞挖掘&#x…

基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计

摘要 随着医疗信息化的不断推进以及“互联网医疗”模式的广泛普及&#xff0c;传统医院挂号流程中存在的排队时间长、资源分配不均等问题日益凸显&#xff0c;急需通过数字化手段加以解决。本研究设计并实现了一套基于Java、SpringBoot、Vue与UniAPP技术栈的医院预约挂号微信小…

制作一款打飞机游戏62:添加音效

添加音乐 今天&#xff0c;我们要添加音乐。 首先&#xff0c;打开包含音轨的文件夹&#xff0c;然后使用文本编辑器打开cowshrub文件。接着&#xff0c;打开捐赠卡&#xff0c;复制其中的音乐和音效数据&#xff0c;粘贴到cowshrub文件中&#xff0c;替换原有的音效块&#…

WPF log4net用法

WPF log4net用法 一、在工程中管理NuGet程序包&#xff0c;找到log4net&#xff0c;点击安装&#xff0c;如下图已成功安装&#xff1b; 二、在工程中右键添加新建项&#xff0c;选择应用程序配置文件&#xff08;后缀为.config&#xff09;,然后设置名称&#xff0c;这里设置…

视频监控管理平台EasyCVR安防监控小知识:视频监控AI智能分析的常见部署方式有哪些?

一、方案背景​ 随着视频监控技术迭代&#xff0c;AI智能分析成为提升系统价值的核心。通过实时处理视频流辅助决策&#xff0c;广泛应用于智慧社区、园区等场景。由于AI算法部署方式多样且各有适用场景&#xff0c;因此合理选择部署方式是项目成功的关键。 二、主流AI算法部署…

5G RedCap是什么-与标准5G的区别及支持路由器推荐

技术背景与重要性 从智能穿戴到工业传感器&#xff0c;物联网设备种类繁多&#xff0c;但并非所有设备都需要标准5G的全部功能。为满足这些中端应用的需求&#xff0c;3GPP在Release 17中引入了5G RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;也称为5G NR-L…

vmware虚拟机固定IP

vmware虚拟机固定IP vmware虚拟机端设置 vmware 设置nat模式 打开设置“网络和Internet”&#xff0c;点击“更改适配器选项”&#xff0c;点击适配器VMnet8&#xff0c;修改IP和DNS相关配置 虚拟机端设置 root用户登录虚拟机&#xff0c;输入命令&#xff1a; vi /et…

据传苹果将在WWDC上发布iOS 26 而不是iOS 19

苹果可能会对其操作系统的编号方式做出重大改变&#xff0c;基于年份的新版系统会将iOS 19重新命名为 iOS 26&#xff0c;同时 macOS 也会以同样的方式命名。 苹果的编号系统相当简单&#xff0c;版本号每年都会像钟表一样定期更新。然而&#xff0c;今年秋天情况可能有所不同&…

【深度剖析】义齿定制行业数字化转型模式创新研究(上篇2:痛点和难点分析)

数字化转型正在重塑义齿行业的生态格局,但也面临技术融合与模式变革的深层挑战。当前,义齿定制行业正处于从传统手工制造向全流程数字化制造转型的关键阶段。3D扫描、CAD/CAM(计算机辅助设计与制造)、3D打印等技术的广泛应用,显著提升了义齿制作的精度和效率。传统石膏模型…

英语学习5.29

主语 be动词 the first to do sth ✅ 例句解析&#xff1a; He was the first to arrive at the meeting. 他是第一个到会议现场的人。 Zhai Zhigang was the first Chinese astronaut to walk in space. 翟志刚是第一个进行太空行走的中国宇航员。 She is the first in h…

【从零开始学习QT】快捷键、帮助文档、Qt窗口坐标体系

目录 Qt Creator 中的快捷键 使用帮助文档 Qt 窗口坐标体系 QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 Qt Creator 中的快捷键 • 注释&#xff1a;ctrl / • 运行&#xff1a;ctrl R • 编译&#xff1a;ctrl B • 字体缩放&#xff1a;ctrl 鼠标滑轮 • 查找&am…

docker网络相关内容详解

一、docker与k8s 一、Docker 核心解析 1. Docker 定义与架构 本质&#xff1a; 容器化平台&#xff08;构建容器化应用&#xff09;、进程管理软件&#xff08;守护进程管理容器生命周期&#xff09;。客户端&#xff08;docker cli&#xff09;与服务端&#xff08;docker ser…

制造企业生产数据分析全解析:5大类数据定义、分析方法与落地指南

在制造业精细化管理需求日益迫切的背景下&#xff0c;生产数据分析成为破解效率低下、成本高企、质量波动等难题的关键。本文系统解析制造企业生产数据的核心类别、分析逻辑及落地路径&#xff0c;提供从数据采集到决策优化的全流程方法论。 文章首先阐明生产数据分析的核心价…

C# 类和继承(屏蔽基类的成员)

屏蔽基类的成员 虽然派生类不能删除它继承的任何成员&#xff0c;但可以用与基类成员名称相同的成员来屏蔽&#xff08;mask&#xff09; 基类成员。这是继承的主要功能之一&#xff0c;非常实用。 例如&#xff0c;我们要继承包含某个特殊方法的基类。该方法虽然适合声明它的…

C语言——数组

一、数组的概念 数组是一组相同类型元素的集合&#xff1b;从这个概念中我们就可以发现2个有价值的信息&#xff1a; &#xff08;1&#xff09;数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 &#xff08;2&#xff09;数组中存放的多个数据&#xff…

Flink

文章目录 Flink1.Flink简介2.为什么选择Flink2.1 传统数据处理架构2.2 大数据Lambda架构2.3 流处理架构2.4 Flink是理想的流计算框架2.5 Flink的优势 3.Flink应用场景3.1 事件驱动型应用3.2 数据分析应用3.3 数据流水线应用 4.Flink技术栈5.Flink体系架构 Flink 1.Flink简介 …

使用C# 快速删除Excel表格中的重复行数据-详解

目录 简介 使用工具 C# 删除Excel工作表中的重复行 C# 删除指定Excel单元格区域中的重复行 C# 基于特定列删除重复行 RemoveDuplicates 方法快速比较 简介 重复行是指在Excel表格中完全相同的多行数据。这些冗余行的存在可能源于多种原因&#xff0c;例如&#xff1a; …

OpenCv高阶(十九)——dlib关键点定位

文章目录 一、什么是人脸关键点定位&#xff1f;二、关键点模型的下载及关键信息的理解三、dlib关键点定位的简单实现&#xff08;1&#xff09;导入必要的库&#xff08;2&#xff09;从指定路径读取图像文件&#xff08;3&#xff09;创建dlib的正面人脸检测器对象&#xff0…

【Java】线程池的实现原理是怎样的?CPU密集型任务与IO密集型任务的区别?

一、CPU密集型与IO密集型任务 1.CPU密集型任务(CPU-bound) 定义&#xff1a;需要大量CPU计算资源&#xff0c;大部分时间都在进行运算的任务。 这类任务的特点是计算量大&#xff0c;CPU占用率高。 特点&#xff1a; 主要消耗CPU资源执行速度取决于CPU的计算能力通常涉及复…