C++循环补0使字符串长度为16的倍数时报std::length_error如何解决
问题原因分析
- 补位计算逻辑错误:你的需求是将字符串补0到长度可被16整除,无需判断长度奇偶,直接计算需要补的0的个数即可。当字符串长度大于15时,你代码中
15 - usrinp.length()会得到负数,string::append接收负数字符数参数时就会抛出你遇到的std::length_error异常。 - 多余的循环逻辑:补位操作一次即可完成,你写的for循环会动态修改字符串长度,可能导致循环逻辑混乱,完全没有存在必要。
- 头文件引用错误:使用
std::string需要引用<string>头文件,你引用的<string.h>是C语言字符串处理函数的头文件,和std::string无关。
修正后代码
#include <iostream> #include <string> using namespace std; int check(string usrinp) { // 计算需要补的0的个数,如果已经是16的倍数则补0个 int pad_len = (16 - usrinp.length() % 16) % 16; if (pad_len > 0) { usrinp.append(pad_len, '0'); } cout << usrinp << endl; return 0; } int main(){ check("1"); return 0; }
验证说明
输入字符串长度为1时,计算得pad_len = (16 - 1%16) %16 = 15,补15个0后总长度16,符合要求;如果输入长度本身就是16的倍数,pad_len为0,不会进行额外填充,符合需求。
内容的提问来源于stack exchange,提问作者NotAidan
相关产品推荐
相关产品推荐

