C#控制台如何录入多字符姓名字符串解决ToChar转换报错
问题背景
需要实现的C#控制台程序规则:
- 录入规则:按顺序输入两组数据,每组包含姓名、耗时两个字段,输入顺序为姓名1、时间1、姓名2、时间2
- 输出规则:对比两个耗时,输出耗时更短(成绩最优)的对应姓名
现有代码仅支持单字符姓名输入,输入长度大于1的全名时会抛出String must be exactly one character long运行时错误,原有代码如下:
string inputdata = Console.ReadLine(); char name = Convert.ToChar(inputdata); inputdata = Console.ReadLine(); double time1 = Convert.ToDouble(inputdata); inputdata = Console.ReadLine(); char name2 = Convert.ToChar(inputdata); inputdata = Console.ReadLine(); double time2 = Convert.ToDouble(inputdata); inputdata = Console.ReadLine(); if (time1 < time2) { Console.WriteLine(name); } else { Console.WriteLine(name2);
错误根因
char类型仅能存储单个字符,你将输入的姓名强制转换为char类型,只要输入内容长度不是1,Convert.ToChar()就会触发长度校验报错。姓名属于任意长度的文本,直接用string类型存储即可,无需转成char。另外原有代码末尾缺少闭合大括号,还多写了一次无意义的Console.ReadLine()调用,会导致程序要求额外多输入一次内容才会执行判断。
修复后代码
// 读取第一组参赛数据 string name1 = Console.ReadLine(); double time1 = Convert.ToDouble(Console.ReadLine()); // 读取第二组参赛数据 string name2 = Console.ReadLine(); double time2 = Convert.ToDouble(Console.ReadLine()); // 对比耗时输出最优成绩姓名 Console.WriteLine(time1 < time2 ? name1 : name2);
优化建议
- 存储姓名直接使用
string类型,Console.ReadLine()返回值本身就是字符串,不需要额外类型转换,支持任意长度的中英文姓名输入 - 如果要提升程序健壮性,可以用
double.TryParse()做耗时输入的合法性校验,避免用户输入非数字内容时程序崩溃 - 简单的二选一判断可以用三元运算符简化代码,写法更简洁
内容的提问来源于stack exchange,提问作者Catalin Stoia
相关产品推荐
相关产品推荐

