题目要求
输入的字符串必须包含文件路径、文件名和文件扩展名,将这三类分别拆解输出。
输入格式
D:\NOWCODER.NET\C#编程实践\拆解输入的文件路径(学习笔记).docx
输出格式
文件路径:D:\NOWCODER.NET\C#编程实践
文件名:拆解输入的文件路径(学习笔记)
扩展名:docx
编程平台
Visual Studio 2017 控制台
代码实现
初始版代码
/* 思路:倒序检查输入的字符串。 */ string input = Console.ReadLine(); // 获取用户输入 int i = 0; for (i = input.Length - 1; i >= 0; --i) // 寻找'.' { if (input[i] == '.') { break; } } if (i != -1 && i != input.Length - 1) // 存在'.'且'.'不是位于最后一个字符 { int j = 0; for (j = i - 1; j >= 0; --j) // 寻找'.'前面有没有的'\' { if (input[j] == '\\') { break; } } if (j != -1) // 说明有'\' { if (i - 1 - j != 0) // 说明字符串最后一个'\'和'.'中间有内容 { string extensionName = input.Substring(i + 1, input.Length - 1 - i); string fileName = input.Substring(j + 1, i - 1 - j); string filePath = input.Substring(0, j + 1); Console.WriteLine("文件路径:{0}", filePath); Console.WriteLine("文件名:{0}", fileName); Console.WriteLine("扩展名:{0}", extensionName); } else { Console.WriteLine("您输入的字符串没有文件名!"); } } else { Console.WriteLine("您输入的字符串没有文件路径!"); } } else { Console.WriteLine("您输入的字符串没有扩展名!"); } // 不足:判断分支过多,不易理解。
改进版代码
/* 思路:先假设输入的字符串符合题意,直接拆解字符串,拆解过程失败或拆解结果为空则报错。 */ try { string input = Console.ReadLine(); // 获取用户输入 string filePath = input.Substring(0, input.LastIndexOf('\\') + 1); string fileName = input.Substring(input.LastIndexOf('\\') + 1, input.LastIndexOf('.') - input.LastIndexOf('\\') - 1); string extensionName = input.Substring(input.LastIndexOf('.') + 1, input.Length - input.LastIndexOf('.') - 1); if (filePath == "" || fileName == "" || extensionName == "") { Console.WriteLine("您输入的字符串不是一个合法的地址!"); } else // 拆解成功,说明是合法地址 { Console.WriteLine("文件路径:{0}", filePath); Console.WriteLine("文件名:{0}", fileName); Console.WriteLine("扩展名:{0}", extensionName); } } catch (Exception e) { Console.WriteLine("您输入的字符串不是一个合法的地址!"); } // 不足:报错提示笼统,无法指明直接错误。
优化版代码
/* 思路:逐步检查字符串是否符合要求,并用临时变量记录是否有错误。 */ string input = Console.ReadLine(); // 获取用户输入 bool hasError = false; if (!input.Contains("\\")) // 文件路径中一定有‘\’ { Console.WriteLine("您输入的地址没有文件路径!"); hasError = true; } if (!Regex.IsMatch(input.Substring(input.LastIndexOf(".") + 1), "^[a-zA-Z0-9]+$")) // 扩展名一定由一个或多个数字或字母组成 { Console.WriteLine("您输入的地址没有扩展名!"); hasError = true; } if (input.LastIndexOf('.') - input.LastIndexOf('\\') - 1 == 0) // 检查最后一个‘\’和‘.’之间一定有字符 { Console.WriteLine("您输入的地址没有文件名!"); hasError = true; } if (hasError == false) // 说明是一个合法的地址,可以进行拆解 { string filePath = input.Substring(0, input.LastIndexOf('\\') + 1); string fileName = input.Substring(input.LastIndexOf('\\') + 1, input.LastIndexOf('.') - input.LastIndexOf('\\') - 1); string extensionName = input.Substring(input.LastIndexOf('.') + 1, input.Length - input.LastIndexOf('.') - 1); Console.WriteLine("文件路径:{0}", filePath); Console.WriteLine("文件名:{0}", fileName); Console.WriteLine("扩展名:{0}", extensionName); }
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!