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

news2025/7/22 12:00:04

        在 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.coloradmin.cn/o/2397593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TDengine 运维——巡检工具(安装前检查)

简介 本文档旨在介绍 TDengine 安装部署前后配套的巡检工具。 相关工具的功能简介&#xff1a; 工具名称功能简介安装前检查部署前对 TDengine 安装部署的依赖要素进行安装前检查安装前预配置部署前对 TDengine 安装部署的依赖要素进行安装前预配置安装部署指定环境安装部署…

【Linux】权限chmod命令+Linux终端常用快捷键

目录 linux中权限表示形式 解析标识符 权限的数字序号 添加权限命令chmod 使用数字表示法设置权限 使用符号表示法设置权限 linux终端常用快捷键 &#x1f525;个人主页 &#x1f525; &#x1f608;所属专栏&#x1f608; 在 Linux 系统里&#xff0c;权限管理是保障系…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…

Go语言的context

Golang context 实现原理 本篇文章是基于小徐先生的文章的修改和个人注解&#xff0c;要查看原文可以点击上述的链接查看 目前我这篇文章的go语言版本是1.24.1 context上下文 context被当作第一个参数&#xff08;官方建议&#xff09;&#xff0c;并且不断的传递下去&…

数据库原理 试卷

以下是某高校教学管理系统的毕业论文指导ER图&#xff0c;数据信息&#xff1a;一名教师指导多名学生&#xff0c;一名学生只能选择一名教师&#xff0c;试分析完成以下各题&#xff0c;如用SQL命令完成的&#xff0c;在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…

【Qt开发】对话框

目录 1&#xff0c;对话框的介绍 2&#xff0c;Qt内置对话框 2-1&#xff0c;消息对话框QMessageBox 2-2&#xff0c;颜色对话框QColorDialog 2-3&#xff0c;文件对话框QFileDialog 2-4&#xff0c;字体对话框QFontDialog 2-5&#xff0c;输入对话框QInputDialog 1&…

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

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 匿名[校招]攻防研究员(应用安全) 基础部分 1. HTTP状态码 2. HTTP请求方法及作用 3. 网络分层及协议 OW…

碰一碰发视频系统--基于H5场景开发

#碰一碰发视频# 旨在构建一个基于移动网页&#xff08;H5&#xff09;的视频“碰传”交互系统&#xff0c;提供类似华为/苹果设备 NFC 轻碰分享的便捷体验。其核心技术依赖于移动端可用的近场通信&#xff08;NFC 或 H5 相关 API&#xff09;和可靠的媒体数据传输方案。实现细节…

MagicAnimate 论文解读:引入时间一致性的视频人物动画生成方法

1. 前言/动机 问题&#xff1a;现有动画生成方法缺乏对时间信息的建模&#xff0c;常常出现时间一致性差的问题 描述&#xff1a; 现有的动画生成方法通常采用帧变形&#xff08;frame-warping&#xff09;技术&#xff0c;将参考图像变形以匹配目标动作。尽管这类方法能生成较…

数据结构:递归(Recursion)

目录 示例1&#xff1a;先打印&#xff0c;再递归 示例2&#xff1a;先递归&#xff0c;再打印 递归的两个阶段 递归是如何使用栈内存 复杂度分析 递归中的静态变量 内存结构图解 递归&#xff1a;函数调用自己 必须有判断条件来使递归继续或停止 我们现在通过这两个示…

Cesium快速入门到精通系列教程一:打造第一个Cesium应用

一、打造第一个Cesium应用 1、官方渠道下载Cesium&#xff08;可选择历史版本&#xff09; ​​GitHub Releases页面​​&#xff1a;https://github.com/CesiumGS/cesium/releases 访问 Cesium GitHub Releases&#xff0c;此处列出了所有正式发布的版本。 通过标签&#…

力扣题解106:从中序与后序遍历序列构造二叉树

一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说&#xff0c;我们需要利用中序遍历序列和后序遍历序列的特点&#xff0c;通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是&#xff1a;左子树 -> 根节点 -> 右子树。后…

学习STC51单片机25(芯片为STC89C52RCRC)

每日一言 生活就像弹簧&#xff0c;你弱它就强&#xff0c;你强它就弱&#xff0c;别轻易认输。 ESP8266作为路由器模式&#xff08;AP模式&#xff09;也就是在局域网内可以有服务器的作用 那么我们需要将pc作为设备进行连接ESP的发射出来的WIFE 叫做这个AI啥的 也有可能叫做…

宁夏农业科技:创新引领,赋能现代农业新篇章

在广袤的宁夏大地上&#xff0c;农业科技如同一股强劲的春风&#xff0c;吹拂着每一寸土地&#xff0c;为宁夏的农业发展注入了新的活力与希望。近年来&#xff0c;宁夏农业科技以其独特的创新力和实践力&#xff0c;不断推动着现代农业的转型升级&#xff0c;让这片古老的土地…

Accelerate 2025北亚巡展正式启航!AI智御全球·引领安全新时代

近日&#xff0c;网络安全行业年度盛会Accelerate 2025北亚巡展正式在深圳启航&#xff01;智库专家、产业领袖及Fortinet高管、产品技术团队和300余位行业客户齐聚一堂&#xff0c;围绕“AI智御全球引领安全新时代”主题&#xff0c;共同探讨AI时代网络安全新范式。大会聚焦三…

005学生心理咨询评估系统技术解析:搭建科学心理评估平台

学生心理咨询评估系统技术解析&#xff1a;搭建科学心理评估平台 在心理健康教育日益受重视的当下&#xff0c;学生心理咨询评估系统成为了解学生心理状态的重要工具。该系统涵盖试卷管理、试题管理等核心模块&#xff0c;面向管理员和用户两类角色&#xff0c;通过前台展示与…

贪心算法应用:多重背包启发式问题详解

贪心算法应用&#xff1a;多重背包启发式问题详解 多重背包问题是经典的组合优化问题&#xff0c;也是贪心算法的重要应用场景。本文将全面深入地探讨Java中如何利用贪心算法解决多重背包问题。 多重背包问题定义 **多重背包问题(Multiple Knapsack Problem)**是背包问题的变…

【保姆级教程】PDF批量转图文笔记

如果你有一个PDF文档&#xff0c;然后你想把它发成图文笔记emmm&#xff0c;最好再加个水印&#xff0c;你会怎么做&#xff1f; 其实也不麻烦&#xff0c;打开PDF文档&#xff0c;挨个截图&#xff0c;然后打开PS一张一张图片拖进去&#xff0c;再把水印图片拖进去&#xff0…

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)

数据库系统概论&#xff08;十一&#xff09;SQL 集合查询 超详细讲解&#xff08;附带例题表格对比带你一步步掌握&#xff09; 前言一、什么是集合查询&#xff1f;二、集合操作的三种类型1. 并操作2. 交操作3. 差操作 三、使用集合查询的前提条件四、常见问题与注意事项五、…

clickhouse如何查看操作记录,从日志来查看写入是否成功

背景 插入表数据后&#xff0c;因为原本表中就有数据&#xff0c;一时间没想到怎么查看插入是否成功&#xff0c;因为对数据源没有很多的了解&#xff0c;这时候就想怎么查看下插入是否成功呢&#xff0c;于是就有了以下方法 具体方法 根据操作类型查找&#xff0c;比如inse…