固定字符串长度处理函数报错及合并优化问题
搞定固定长度字符串格式化:修复索引错误+合并函数
嘿,我来拆解下你遇到的问题,以及你最终方案的巧妙之处:
问题出在哪?
首先看你踩的两个坑:
截断函数的逻辑错误:
你写的truncString里用了return s.substr(0,s.length()-desiredlength);,这完全搞反了需求。咱们要的是把长字符串截断到desiredlength长度,正确的做法应该是直接取前desiredlength个字符,而不是用原长度减目标长度当截取参数。举个例子:如果原字符串长70,目标长度60,s.length()-desiredlength是10,这时候substr(0,10)只会取前10个字符,根本不是我们要的;更糟的是,如果不小心传入了比目标短的字符串(虽然你的调用逻辑里没走这条路,但函数本身没做校验),s.length()-desiredlength会变成负数,直接触发索引越界的错误——这就是你遇到的问题根源。冗余的调用逻辑:
原来要先判断字符串长度,再分别调用补空格或截断函数,代码重复还麻烦,合并成一个函数肯定更清爽。
你的解决方案太赞了!
你最终写的formatString函数用两步就完美解决了所有情况:
- 第一步:如果字符串不够长,循环补空格到目标长度(和原来的
formatSpace逻辑一致) - 第二步:直接返回前
length个字符——这一步简直是一举两得:- 如果补完空格刚好达标,就返回整个字符串
- 如果原字符串本来就超长,直接截取前
length个完成截断
不管输入是长是短,都能输出固定长度的结果,逻辑简洁到不行,还省去了多余的判断。
原问题代码(带错误的截断函数)
// 正常工作的补空格函数 public String formatSpace(String s, int desiredlength){ while (s.length()<desiredlength){ s += " "; } return s; } // 存在逻辑错误的截断函数 public String truncString(String s, int desiredlength){ return s.substr(0,s.length()-desiredlength); // 这里会导致索引负数或截取结果错误 } // 原调用逻辑 int maxlen = 60; if (field.length()<maxlen){ field = formatSpace(field,maxlen); }else if (field.length()>maxlen){ field = truncString(field,maxlen); }
最终解决的单函数
private String formatString(String s, int length) { while (s.length() < length) { s += " "; } return s.substring(0, length); }
可选优化建议
如果需要补很多空格,循环拼接的效率可以再提升下——直接计算需要补的空格数,一次性生成空格字符串拼接:
private String formatString(String s, int length) { if (s.length() >= length) { return s.substring(0, length); } // 一次性生成所需的空格,避免循环拼接 int spacesNeeded = length - s.length(); return s + " ".repeat(spacesNeeded); }
这样性能会更好,尤其是当目标长度和原字符串长度差距很大的时候。
内容的提问来源于stack exchange,提问作者Phyxil
相关产品推荐
相关产品推荐

